网站建设seo,单位网站建设要多少钱,50m专线做视频网站,iapp用网站做软件代码ReentrantLock、ReentrantReadWriteLock、StampedLock
读写锁
一个资源可以被多个读线程访问#xff0c;或者被一个写线程访问#xff0c;但是不能同时存在读写线程。
小口诀#xff1a;读写互斥#xff0c;读读共享
锁的演变
无锁----- 独占锁-----读写锁---…ReentrantLock、ReentrantReadWriteLock、StampedLock
读写锁
一个资源可以被多个读线程访问或者被一个写线程访问但是不能同时存在读写线程。
小口诀读写互斥读读共享
锁的演变
无锁----- 独占锁-----读写锁-----邮戳锁 ReentrantReadWriteLock读写锁
ReentrantReadWriteLock读写锁并不是真正意义上的读写分离它只允许读读共存读写和写写依然是互斥的
使用场景读多写少的情况下适合使用读写锁
缺点
1.锁饥饿一直都是读线程获得锁写线程抢不到锁
2.锁降级遵循获取写锁-----再获取读锁-----再释放写锁的次序写锁能够降级成为读锁
如果一个线程占有写锁在不释放写锁的情况下它还能占有读锁即写锁降级为读锁
写锁降级读锁可以读锁降级到写锁不可以
代码证明 结果也证实在获取写锁后不需要释放写锁就可以直接获取读锁也就是锁降级
接下来证明相反情况读锁到写锁先说结论读锁到写锁需要先释放读锁才能获取到写锁 小问题
为什么需要锁降级也就是为什么获取写锁还可以获取读锁这样做的意义是什么
答写后立即可以读在高并发情况下很可能有多个写操作将资源修改造成数据紊乱锁降级可以在写锁内再获取读锁由于读写互斥所以其他写操作必须等到读锁释放才能获取写锁。
由此可以知道读写锁会导致锁饥饿为解决该问题邮戳锁提出解决方案
StampedLock 邮戳锁
特点
1.所有获取锁的方法都返回一个邮戳StampStamp为零表示获取失败其余表示成功
2.所有释放锁的方法都需要一个邮戳Stamp这个Stamp必须是和成功获取锁时得到的Stamp一致
3.StampLock是不可重入的如果一个线程已经持有写锁再去获取写锁就会造成死锁
StampLock的三种访问模式
1.Reading读模式功能与ReentrantReadWriteLock的读锁类似
2.Writing写模式功能和ReentrantReadWriteLock的写锁类似
3.Optimistic reading乐观读模式无锁机制类似数据库中的乐观锁支持读写并发很乐观的认为读取时没人修改假如被修改再实现锁升级为悲观读模式
缺点工作中不要用
1.StampLock不支持重入
2.StampLock的悲观读锁和写锁都不支持条件变量Condition
3.使用StampLock不要调用interrupt()方法