StampdLock:Java8中的乐观锁

上文中讲到了ReadWriteLock这种读写锁方法作为缓存策略那么有没有效率更高的方法

重点方法
long stamp = stampedLock.tryOptimisticRead();//乐观锁
long stamp = stampedLock.readLock(); //悲观读锁
long stamp = stampedLock.writeLock();//主观读锁
boolean hasWriteLock = stampedLock.validate();//如果有写锁返回false如果没有返回true

如下面的代码先通过tryOptimisticRead获取一个stamp这个操作是没有锁的,这中间可以读取变量,然后在调用validate方法校验是否有写锁,如果有,将锁升级成读锁。如果没有直接返回。因为没有写锁时候是不加锁的所以效率很高。这点很类似咱们mysql的乐观锁。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public long read() {
long stamp = stampedLock.tryOptimisticRead();
//无锁操作
//如果有写锁返回false,升级成悲观读
if (!stampedLock.validate(stamp)) {
stamp = stampedLock.readLock();
try {
//读模板
} finally {
stampedLock.unlockRead(stamp);
}
}
return i;
}

//写模板
public void write(long i) {
long stamp = stampedLock.writeLock();
try {
//todo 写
} finally {
stampedLock.unlock(stamp);
}
}