StampedLock如何使用?

Posted constxiong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了StampedLock如何使用?相关的知识,希望对你有一定的参考价值。

  • 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;
    }
    
}

 


原文链接
 


技术图片

 

 

以上是关于StampedLock如何使用?的主要内容,如果未能解决你的问题,请参考以下文章

使用StampedLock

StampedLock 如何对锁请求进行排队?

并发编程系列之StampedLock使用

并发编程系列之StampedLock使用

使用StampedLock

使用StampedLock替代ReentrantReadWriteLock