public class NumSumTst {
private static Logger log = Logger.getLogger(NumSumTst.class.getName());
private static final StampedLock lock = new StampedLock();
private static int num1 = 1;
private static int num2 = 1;
private static int sum() {
log.info("求和方法执行了");
long stamp = lock.tryOptimisticRead();
int cnum1 = num1;
int cnum2 = num2;
log.info("获取到的成员变量值, cnum1 " + cnum1 + " cnum2 " + cnum2);
try {
Thread.sleep(3000);
} catch (Exception e) {}
if (!lock.validate(stamp)) {
log.info("存在写操作");
stamp = lock.readLock();
try {
log.info("升级悲观读锁");
cnum1 = num1;
cnum2 = num2;
log.info("重新获取到了成员变量值+============ cnum1 " + cnum1 + " cnum2 " + cnum2);
} finally {
lock.unlock(stamp);
}
}
return cnum1 + cnum2;
}
private static void updateNum() {
long stamp = lock.writeLock();
try {
num1 = 2;
num2 = 2;
} finally {
lock.unlock(stamp);
}
}
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
int sum = sum();
log.info("求和结果" + sum);
});
t1.start();
Thread.sleep(1000);
updateNum();
t1.join();
log.info("执行完毕");
}
}
以上就是简单的例子;
- StampedLock与读写锁的区别就是 unlock的时候,需要传入lock返回的long值
- StampedLock比读写锁灵活的地方在于,读锁没有释放的时候;写锁还是可以获取成功的
- StampedLock不支持重入
- StampedLock适合读多写少的场景;否则不如Synchronized
- StampedLock的悲观读锁、写锁不支持条件变量
- 千万不能中断阻塞的悲观读锁或写锁,如果调用阻塞线程的interrupt(),会导致cpu飙升,如果希望StampedLock支持中断操作,需要使用readLockInterruptibly writeLockInterruptibly