该类自JDK8加入。是为了进一步优化读性能,它的特点是在使用读锁、写锁时都必须配合【戳】使用
加解读锁
StampedLock stampedLock = new StampedLock();
long stamped = stampedLock.readLock();
加解写锁
StampedLock stampedLock = new StampedLock();
long stamped = stampedLock.writeLock();
乐观读
StampedLock支持tryoptimisticRead()方法(乐观读),读取完毕后需要做一次戳校验如果校验通过,表示这期间确实没有写操作,数据可以安全使用,如果校验没通过,需要重新获取读锁,保证数据安全。
// 尝试无锁读
long stamped = stampedLock.tryOptimisticRead();
public int read(){
// 尝试无锁读
long stamped = stampedLock.tryOptimisticRead();
if (stampedLock.validate(stamped)){
System.out.println("验戳成功...");
return data;
}
// 验戳失败,无锁读失败,需要锁升级为读锁
try {
stamped = stampedLock.readLock();
return data;
}finally {
stampedLock.unlockRead(stamped);
}
}
StampedLock的特点
- 通过比较戳的方式来判断是否有写操作破坏数据一致性,如果没有写操作则不需要升级为读锁,从而提升性能
- StampedLock不支持条件变量(即不支持newCondition() 无法使用await()等操作)
- StampedLock不支持重入不是重入锁(ReentrantLock支持重入;ReentrantReadWriteLock支持向下兼容的重入,即写锁可以重入读锁,读锁不能重入写锁需要先解锁)