java 5 ReadWriteLock

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class ReadWriteLockTest
{
    private static List<String> list = new ArrayList<String>();
    public static void main(String[] args)
    {
        for(int i = 0; i < 10; i++)
        {
            list.add("init - " + i);
        }
        new Thread(new Runnable()
        {
            public void run()
            {
                try
                {
                    ReadWriteLockTest.add();
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
        }).start();
        new Thread(new Runnable()
        {
            public void run()
            {
                try
                {
                    ReadWriteLockTest.get();
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    private static ReadWriteLock lock = new ReentrantReadWriteLock();
    private static void add() throws Exception
    {
        for(int i = 0; i < 10; i++)
        {
            lock.writeLock().lock();
            list.add("add-" + i);
            lock.writeLock().unlock();
            System.out.println("add " + i);
            Thread.sleep(500);
        }
    }

    private static void get() throws Exception
    {
        lock.readLock().lock();
        for(String str : list)
        {
            System.out.println("get- " + str);
            Thread.sleep(500);
        }
        lock.readLock().unlock();
    }
}

上面有2个线程同时对list变量读写,如果不使用读写锁,则程序会抛出异常。

多个读锁不互斥,读锁也写锁互斥,写锁与写锁互斥。

时间: 2024-12-21 09:42:06

java 5 ReadWriteLock的相关文章

Java Concurrency - ReadWriteLock &amp; ReentrantReadWriteLock

锁所提供的最重要的改进之一就是 ReadWriteLock 接口和它的实现类 ReentrantReadWriteLock.这个类提供两把锁,一把用于读操作和一把用于写操作.同一时间可以有多个线程执行读操作,但只有一个线程可以执行写操作.当一个线程正在执行一个写操作,不可能有任何线程执行读操作. public class VisitCounter { private ReadWriteLock lock; private long counter; public VisitCounter() {

java多线程 -- ReadWriteLock 读写锁

写一条线程,读多条线程能够提升效率. 写写/读写 需要"互斥";读读 不需要互斥. ReadWriteLock 维护了一对相关的锁,一个用于只读操作,另一个用于写入操作.只要没有 writer,读取锁可以由多个 reader 线程同时保持.写入锁是独占的. ReadWriteLock 读取操作通常不会改变共享资源,但执行写入操作时,必须独占方式来获取锁.对于读取操作占多数的数据结构. ReadWriteLock 能提供比独占锁更高的并发性.而对于只读的数据结构,其中包含的不变性可以完全

Java多线程之~~~ReadWriteLock 读写分离的多线程实现

在多线程开发中,经常会出现一种情况,我们希望读写分离.就是对于读取这个动作来说,可以同时有多个线程同 时去读取这个资源,但是对于写这个动作来说,只能同时有一个线程来操作,而且同时,当有一个写线程在操作这个资 源的时候,其他的读线程是不能来操作这个资源的,这样就极大的发挥了多线程的特点,能很好的将多线程的能力发挥 出来. 在Java中,ReadWriteLock这个接口就为我们实现了这个需求,通过他的实现类ReentrantReadWriteLock我们可 以很简单的来实现刚才的效果,下面我们使用

Java ReadWriteLock 用法

对象的方法中一旦加入synchronized修饰,则任何时刻只能有一个线程访问synchronized修饰的方法.假设有个数据对象拥有写方法与读方法,多线程环境中要想保证数据的安全,需对该对象的读写方法都要加入 synchronized同步块. 这样任何线程在写入时,其它线程无法读取与改变数据:如果有线程在读取时,其他线程也无法读取或写入. 这种方式在写入操作远大于读操作时,问题不大,而当读取远远大于写入时,会造成性能瓶颈,因为此种情况下读取操作是可以同时进行的,而加锁操作限制了数据的并发读取.

【Java】读写锁 ReadWriteLock接口

和被synchronized修饰的对象同时只能被一个线程访问不同,ReadWriteLock接口提供了更细粒度锁机制.ReadWriteLock 维护了一对相关的锁,一个用于只读操作,另一个用于写入操作.只要没有 writer,读取锁可以由多个 reader 线程同时保持,但是写入锁是独占的. 下面是测试代码: import org.junit.Test; import java.text.SimpleDateFormat; import java.util.Date; import java

java 多线程(ReadWriteLock)

package com.example; public class App { public static void main(String[] args) { Info info = new Info(); ReadInfo ri = new ReadInfo(info); WriteInfo wi = new WriteInfo(info); Thread t1 = new Thread(ri,"ri1"); Thread t2 = new Thread(ri,"ri2&

JAVA多线程 &amp; 同步关键词synchronized &amp; ReadWriteLock读写文件

在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限. 1 public class Actor extends Thread { 2 public void run(){ 3 //线程执行的操作 4 } 5 } 在实际开发中一个多线程的操作很少使用Thread类,而是通过Run

java ReadWriteLock 锁

?  对象的方法中一旦加入synchronized修饰,则任何时刻只能有一个线程访问synchronized修饰的方法.假设有个数据对象拥有写方法与读方法,多线程环境中要想保证数据的安全,需对该对象的读写方法都要加入 synchronized同步块.这样任何线程在写入时,其它线程无法读取与改变数据:如果有线程在读取时,其他线程也无法读取或写入.这种方式在写入操作远大于读操作时,问题不大,而当读取远远大于写入时,会造成性能瓶颈,因为此种情况下读取操作是可以同时进行的,而加锁操作限制了数据的并发读取

Java并发编程:Concurrent锁机制解析

.title { text-align: center } .todo { font-family: monospace; color: red } .done { color: green } .tag { background-color: #eee; font-family: monospace; padding: 2px; font-size: 80%; font-weight: normal } .timestamp { color: #bebebe } .timestamp-kwd