介绍
StampedLock 有三种使用方式,分别是
- 悲观读锁:类似 ReadWriteLock 的读锁,共享锁,可多个线程获取
- 写锁:类似 ReadWriteLock 的写锁,排他锁】
- 乐观读:无锁操作,乐观读认为在读取使用共享资源的时候,不会有线程修改共享资源,使用乐观读,进行读取共享资源前,先获取 stamp,在读取使用时,判断是否有线程更改了共享资源,如果更改了,有两种处理方式,一是放弃再重新获取;二是进行锁升级,升级为悲观读锁
使用模板
package cn.zjm404.stu.thread.lock.stamped;
import java.util.concurrent.locks.StampedLock;
public class StampedLockDemo {
private final StampedLock sl = new StampedLock();
public void read(){
//先进行乐观读
//用于判断读取时是否有线程修改共享资源
long stamp = sl.tryOptimisticRead();
//进行读取操作
//...
if(!sl.validate(stamp)){
//升级为悲观锁
stamp = sl.readLock();
try{
//进行读操作
//...
}finally {
//释放悲观锁
sl.unlockRead(stamp);
}
}
}
public void write(){
long stamp = sl.writeLock();
try{
//进行写
//...
}finally {
sl.unlockWrite(stamp);
}
}
}