动漫界面
当前位置:首页 - 手相算命 >

面试官:谈谈读写锁--ReadWriteLock

2019-11-25来源:吉林汽车网
面试官:谈谈读写锁--ReadWriteLock

今天来说说Java 的读写锁-ReadWriteLock,ReadWriteLock是一个接口,实现类是ReentrantReadWriteLock,看着名字的翻译就是可重入读写锁。

为什么Java会搞了那么多种类的锁,因为不同的场景需要做不同的适配来达到性能和使用的最优,而读写锁的使用场景就是读多写少。

读写锁是什么?

读写锁就是分了两种情况,一种是读时的锁,一种是写时的锁,它允许多个线程同时读共享变量,但是只允许一个线程写共享变量,当写共享变量的时候也会阻塞读的操作。这样在读的时候就不会互斥,提高读的效率。

可重入锁是什么?

可重入锁指的是在同一个线程内如果你的外层函数已经获得了锁,那么当你的内层函数也能获取锁,也就是通过一个线程再次进入同步代码块时可以获得自己已经获得的锁,而不可重入则反之。看下简单的示例

面试官:谈谈读写锁--ReadWriteLock

可重入锁这样使用上面代码是没问题的,如果不可重入锁这样的调用是不允许的。

来看看Javadoc中ReentrantReadWriteLock的示例,主要说的就是处理一个获取一个缓存数据的示例

面试官:谈谈读写锁--ReadWriteLock

可以看出使用还是简单的,相对于ReentrantLock来说就是多了个角色区别一个是读锁一个是写锁。

读写锁的升降级

上面代码有提到

Must release read lock before acquiring write lock (在获取写锁前必须释放读锁)

也就是说读写锁不允许锁的升级,不能直接从读锁升级到写锁。如果读锁还没有释放,此时获取写锁,会导致写锁永久等待,最终导致相关线程都阻塞,GG。切记不可这样使用。

但是锁的降级是允许的

// Downgrade by acquiring read lock before releasing write lock

(通过在释放写锁之前获取读锁来降级)

也就是说在释放写锁之前可以获取读锁来达到锁的降级!

读写锁还有一点不同就是写锁是支持条件变量的也就是支持newCondition,而读锁是不支持条件变量的,如果读锁调用newCondition会抛UnsupportedOperationException。

读写锁实现了java.util.concurrent.locks.Lock接口,所以tryLock()、lockInterruptibly()等方法都是支持的。

并且也支持公平锁和非公平锁的模式,底层是也是基于AbstractQueuedSynchronizer实现的,所以对于公平和非公平锁的实现可以参见面试官:说说Java中的信号量?Semaphore 我的这篇文章


如有错误欢迎指正!更多知识分享可关注我

个人公众号:yes的练级攻略

转载文章地址:http://www.showerdoorexpo.com/shouxiangsuanming/28945.html
(本文来自动漫界面整合文章:http://www.showerdoorexpo.com)未经允许,不得转载!
标签:
Java
网站简介 联系我们 网站申明 网站地图

版权所有:www.showerdoorexpo.com ©2017 动漫界面

动漫界面提供的所有内容均是网络转载或网友提供,本站仅提供内容展示服务,不承认任何法律责任。