StampedLock
StampedLock 支持的三种锁模式
StampedLock 支持三种模式,分别是:写锁、悲观读锁和乐观读。其中,写锁、悲观读锁的语义和 ReadWriteLock 的写锁、读锁的语义非常类似,允许多个线程同时获取悲观读锁,但是只允许一个线程获取写锁,写锁和悲观读锁是互斥的。
不同的是:StampedLock 里的写锁和悲观读锁加锁成功之后,都会返回一个 stamp;然后解锁的时候,需要传入这个 stamp。示例如下:
1 | final StampedLock sl = new StampedLock(); |
StampedLock 的性能之所以比 ReadWriteLock 还要好,其关键是 StampedLock 支持乐观读的方式。ReadWriteLock 支持多个线程同时读,但是当多个线程同时读的时候,所有的写操作会被阻塞;而 StampedLock 提供的乐观读,是允许一个线程获取写锁的,也就是说不是所有的写操作都被阻塞。一个使用乐观读的示例如下:
1 | class Point { |
现尝试读取x和y,读取完后判断是否被修改了,如果被修改就升级为悲观读锁,否则直接计算。
StampedLock 使用注意事项
StampedLock 不支持重入。StampedLock 的悲观读锁、写锁都不支持条件变量。