- StampedLock 是从 JDK1.8 开始提供,它的性能比 ReadWriteLock 好
- StampedLock 支持:乐观读锁、悲观读锁、写锁
- StampedLock 的悲观读锁、写锁,与 ReadWriteLock 的读锁、写锁用法相似:读读可并行、读写互斥、写写互斥。
- StampedLock 之所以性能优于 ReadWriteLock,因为它支持乐观读锁。乐观读锁操作,支持一个线程并发进行写操作。
- StampedLock 不支持重入
- StampedLock 支持锁的降级和升级
- StampedLock 可以用悲观读锁调用 readLockInterruptibly() 方法和写锁调用 writeLockInterruptibly() 方法,支持可中断
使用示例:
package constxiong.interview; import java.util.Random; import java.util.concurrent.locks.StampedLock; /** * 测试 StampedLock * @author ConstXiong */ public class TestStampedLock { private static final StampedLock sl = new StampedLock(); private static volatile int count = 0; private static final Random r = new Random(); public static void main(String[] args) { //启动 5个线程写计数,95 个线程读计数, for (int i = 0; i < 100; i++) { if (i % 20 == 0) { new Thread(() -> { try { Thread.sleep(r.nextInt(10)); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + " 计数新增 1 :" + add()); }).start(); } else { new Thread(() -> { try { Thread.sleep(r.nextInt(10)); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + " 读计数:" + read()); }).start(); } } } /** * 读取计数 * @return */ private static int read() { int r; long stamp = sl.tryOptimisticRead(); r = count; if (!sl.validate(stamp)) { stamp = sl.readLock(); try { r = count; } finally { sl.unlockRead(stamp); } } return r; } /** * 计数加 1 */ private static int add() { long stamp = sl.writeLock(); try { count++; } finally { sl.unlockWrite(stamp); } return count; } }
- Java 自学指南
- Java 面试题汇总PC端浏览【点这里】
- Java 面试题小程序