StampedLock 支持的三种锁模式
- 写锁、悲观读锁和乐观读
StampedLock与ReadWriteLock的异同
- ReadWriteLock支持两种:读锁、写锁
- 相同点:其中,写锁、悲观读锁的语义和 ReadWriteLock 的写锁、读锁的语义非常类似,允许多个线程同时获取悲观读锁,但是只允许一个线程获取写锁,写锁和悲观读锁是互斥的。
- 区别:StampedLock 里的写锁和悲观读锁加锁成功之后,都会返回一个 stamp;然后解锁的时候,需要传入这个 stamp
- StampedLock 的性能之所以比 ReadWriteLock 还要好,其关键是 StampedLock 支持乐观读的方式。ReadWriteLock 支持多个线程同时读,但是当多个线程同时读的时候,所有的写操作会被阻塞;而 StampedLock 提供的乐观读,是允许一个线程获取写锁的,也就是说不是所有的写操作都被阻塞。
关于乐观读
- 乐观读这个操作是无锁的,无锁化操作时通过版本号来判断是否在操作过程中存在其他线程的修改操作
- 和数据库的乐观锁有异曲同工之妙
- 数据库中的乐观锁,通过version版本做校验,如果update的时候,版本号不变,则说明在操作期间数据没有被修改过,如果版本号变了,则说明数据有做过修改。
- 这个version字段就相当于StampedLock的stamp