18 StampedLock

StampedLock支持三种模式:写锁、悲观读锁、乐观读   写锁和悲观读锁与ReadWriteLock的写锁、读锁语义类似。StampedLock 里的写锁和悲观读锁加锁成功之后,都会返回一个 stamp;然后解锁的时候,需要传入这个 stamp

ReadWriteLock 支持多个线程同时读,但是当多个线程同时读的时候,所有的写操作会被阻塞;而 StampedLock 提供的乐观读,是允许一个线程获取写锁的。因为乐观读是一个无锁操作,所以允许写操作。


乐观读

在执行乐观读的过程中,如果存在写操作,需要把乐观读升级为悲观读。

乐观读模板

StampedLock注意事项

StampedLock 的功能仅仅是 ReadWriteLock 的子集; StampedLock 不支持重入;  StampedLock 的悲观读锁、写锁都不支持条件变量;StampedLock 支持锁的降级(通过 tryConvertToReadLock() 方法实现)和升级(通过 tryConvertToWriteLock() 方法实现)

如果线程阻塞在 StampedLock 的 readLock() 或者 writeLock() 上时,此时调用该阻塞线程的 interrupt() 方法,会导致 CPU 飙升。所以,使用 StampedLock 一定不要调用中断操作,如果需要支持中断功能,一定使用可中断的悲观读锁 readLockInterruptibly() 和写锁 writeLockInterruptibly()

你可能感兴趣的:(18 StampedLock)