读写锁
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

浙公网安备 33010602011771号