JDK1.8 StampedLock: 解决ReentrantReadWriteLock在读多写少状况下,写线程饥饿问题


ReentrantReadWriteLock 在沒有任何读写锁时,才能够取得写入锁,这可用于实现了悲观读取(Pessimistic Reading),工具

即若是执行中进行读取时,常常可能有另外一执行要写入的需求,为了保持同步,ReentrantReadWriteLock 的读取锁定就可派上用场。线程

 

然而,若是读取执行状况不少,写入不多的状况下,使用 ReentrantReadWriteLock 可能会使写入线程遭遇饥饿(Starvation)问题,对象

也就是写入线程吃吃没法竞争到锁定而一直处于等待状态。同步

StampedLock控制锁有三种模式(写,读,乐观读),一个StampedLock状态是由版本和模式两个部分组成,锁获取方法返回一个数字做为票据stamp,it

它用相应的锁状态表示并控制访问,数字0表示没有写锁被受权访问。在读锁上分为悲观锁和乐观锁。io

所谓的乐观读模式,也就是若读的操做不少,写的操做不多的状况下,你能够乐观地认为,写入与读取同时发生概率不多,所以不悲观地使用彻底的读取锁定,监控

程序能够查看读取资料以后,是否遭到写入执行的变动,再采起后续的措施(从新读取变动信息,或者抛出异常) ,这一个小小改进,可大幅度提升程序的吞吐量!!程序


synchronized是在JVM层面上实现的,不但能够经过一些监控工具监控synchronized的锁定,并且在代码执行时出现异常,JVM会自动释放锁定;
ReentrantLock、ReentrantReadWriteLock,、StampedLock都是对象层面的锁定,要保证锁定必定会被释放,就必须将unLock()放到finally{}中;
StampedLock 对吞吐量有巨大的改进,特别是在读线程愈来愈多的场景下;
当只有少许竞争者的时候,synchronized是一个很好的通用的锁实现;
当线程增加可以预估,ReentrantLock是一个很好的通用的锁实现;方法

相关文章
相关标签/搜索