介绍

StampedLock 有三种使用方式,分别是

  • 悲观读锁:类似 ReadWriteLock 的读锁,共享锁,可多个线程获取
  • 写锁:类似 ReadWriteLock 的写锁,排他锁】
  • 乐观读:无锁操作,乐观读认为在读取使用共享资源的时候,不会有线程修改共享资源,使用乐观读,进行读取共享资源前,先获取 stamp,在读取使用时,判断是否有线程更改了共享资源,如果更改了,有两种处理方式,一是放弃再重新获取;二是进行锁升级,升级为悲观读锁

使用模板

  1. package cn.zjm404.stu.thread.lock.stamped;
  2. import java.util.concurrent.locks.StampedLock;
  3. public class StampedLockDemo {
  4. private final StampedLock sl = new StampedLock();
  5. public void read(){
  6. //先进行乐观读
  7. //用于判断读取时是否有线程修改共享资源
  8. long stamp = sl.tryOptimisticRead();
  9. //进行读取操作
  10. //...
  11. if(!sl.validate(stamp)){
  12. //升级为悲观锁
  13. stamp = sl.readLock();
  14. try{
  15. //进行读操作
  16. //...
  17. }finally {
  18. //释放悲观锁
  19. sl.unlockRead(stamp);
  20. }
  21. }
  22. }
  23. public void write(){
  24. long stamp = sl.writeLock();
  25. try{
  26. //进行写
  27. //...
  28. }finally {
  29. sl.unlockWrite(stamp);
  30. }
  31. }
  32. }