当前位置: 首页 > 后端技术 > Java

阿里方:ReadWriteLock是读写互斥的吗?我什至无法回答,.

时间:2023-04-01 14:51:52 Java

在开发中遇到并发问题,一般会使用锁。Synchronized中一个明显的性能问题是读与读之间的互斥;ReadWriteLock是JDK5中提供的读写分离锁。读写分离锁可以有效帮助减少锁竞争,提高系统性能。ReadWriteLock管理一组锁,一个是只读锁,一个是写锁。JavaConcurrencyLibrary中的ReetrantReadWriteLock实现了ReadWriteLock接口,增加了可重入的特性。读写锁ReentrantReadWriteLock:读写共享、读写互斥、写写互斥;读写锁维护一对锁,一个读锁,一个写锁,通过分离读锁和写锁,使得并发性相对于一般的独占锁有了很大的提升。在读多写少的情况下,读写锁可以提供比独占锁更好的并发性和吞吐量。从源码可以看出,读写锁也是依赖队列同步器Sync(AQS)来实现同步功能,读写状态就是其同步器的同步状态。下面举例说明:读写共享,读写互斥,写写互斥。代码如下:ReadLockreadLock=lock.readLock();WriteLockwriteLock=lock.writeLock();publicvoidread(){try{readLock.lock();System.out.println("线程"+Thread.currentThread().getName()+"回车...");线程.睡眠(3000);System.out.println("线程"+Thread.currentThread().getName()+"退出...");}catch(InterruptedExceptione){e.printStackTrace();}finally{readLock.unlock();}}publicvoidwrite(){try{writeLock.lock();System.out.println("线路程序"+Thread.currentThread().getName()+"进入。。。");Thread.sleep(3000);System.out.println("线程"+Thread.currentThread().getName()+"退出。。。");}catch(InterruptedExceptione){e.printStackTrace();}finally{writeLock.unlock();}}publicstaticvoidmain(String[]args){finalReentrantWriteReadLockTestwr=newReentrantWriteReadLockTest();Threadt1=newThread(newRunnable(){publicvoidrun(){wr.read();}},"t1");Threadt2=newThread(newRunnable(){publicvoidrun(){wr.read();}},"t2");Threadt3=newThread(newRunnable(){publicvoidrun(){wr.write();}},"t3");Threadt4=newThread(newRunnable(){publicvoidrun(){wr.write();}},"t4");t1.start();t2.start();//t3.start();//t4.start();}当我们启动线程t1和t2时,结果如下:线程t1和t2可以是进入时,说明会在Commons上显示!当我们启动线程t2和t3时,结果如下:一个线程必须等待另一个线程退出才能进入,可见读写是互斥的!当我们启动线程t3和t4时,结果如下:一个线程必须等待另一个线程退出才能进入,可见write和write是互斥的!来源:https://www.cnblogs.com/liuqi...近期热点文章推荐:1.1000+Java面试题及答案(2022最新版)2.厉害了!Java协程来了。.3.SpringBoot2.x教程,太全面了!4.不要用爆破爆满画面,试试装饰者模式,这才是优雅的方式!!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!