读写锁

ReentrantReadWriteLock
一种支持一写多读的同步锁,读写分离,可分别分配读锁和写锁。

支持多次分配读锁,使多个读操作可以并发执行。

互斥规则

两个线程都是写操作:互斥,阻塞。

一读一写操作:读阻塞写,写阻塞读。

两个线程都是读操作:不互斥、不阻塞。

在读操作多于写操作的环境下,可在保证线程安全的情况下,,提高运行效率。

 代码示例:

public class ReadWriteDemo {
    //创建读写锁
    private ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
    //获取读锁
    private ReentrantReadWriteLock.ReadLock readLock = readWriteLock.readLock();
    //获取写锁
    private ReentrantReadWriteLock.WriteLock writeLock = readWriteLock.writeLock();
    private String value;

    /**
     * 读取
     *
     * @return
     */
    public String getVal() {
        //使用读锁上锁
        readLock.lock();
        try {
            System.out.println("读取value:" + value);
            return value;
        } finally {
            //解锁
            readLock.unlock();
        }
    }

    /**
     * 写入
     *
     * @param value
     */
    public void setVal(String value) {
        //使用写锁上锁
        writeLock.lock();
        try {
            System.out.println("写入value:" + value);
            this.value = value;
        } finally {
            writeLock.unlock();
        }
    }
}
public static void main(String[] args) {
        ReadWriteDemo readWriteDemo = new ReadWriteDemo();

        //创建线程池
        ExecutorService executorService = Executors.newFixedThreadPool(20);
        long startTime = System.currentTimeMillis();
        //分配2个写操作
        for (int i = 0; i < 2; i++) {
            executorService.submit(() -> readWriteDemo.setVal("Text" + new Random().nextInt(100)));
        }
        //分配18个读取任务
        for (int i = 0; i < 18; i++) {
            executorService.submit(() -> readWriteDemo.getVal());
        }


        //关闭线程池
        executorService.shutdown();
        //判断线程池里的线程是否都执行完毕,并且线程池已关闭。true表示已终止;false标识未终止。
        while (!executorService.isTerminated()) {

        }
        long endTime = System.currentTimeMillis();
        System.out.println("用时:" + (endTime - startTime));
    }

执行结果:

写入value:Text29
写入value:Text90
读取value:Text90
读取value:Text90
读取value:Text90
读取value:Text90
读取value:Text90
读取value:Text90
读取value:Text90
读取value:Text90
读取value:Text90
读取value:Text90
读取value:Text90
读取value:Text90
读取value:Text90
读取value:Text90
读取value:Text90
读取value:Text90
读取value:Text90
读取value:Text90
用时:68

 

posted @ 2022-12-29 01:59  Amireux-126  阅读(12)  评论(0)    收藏  举报