java并发工具包-StampedLock(since jdk1.8)

1. ReentrantLock VS Synchronized

  1. ReentrantLock 提供了较多的API,可以灵活的在线程中获取到锁的一些数据;而Synchronized则无法获得锁的数据。
  2. ReentrantLock 可以更加细粒度的控制线程代码块。
  3. ReentrantLock 相对于Synchronized性能更高效一些。

2. ReentrantReadWriteLock

  1. 对于多个线程的读,不会加锁;提高了吞吐量。而使用其他的锁,为了保证线程的安全性,不管是读还是写,都会加锁;造成性能的一些影响。 写锁在时候的时候,读锁会处于一直waiting的状态。

3. StampedLock

  1. StampedLock悲观锁使用StampedLock做读写锁。 一个StampedLock可以直接获取到ReadLock和WriteLock。这样的写法会和ReentrantReadWriteLock一样,写锁在使用的时候,导致读锁的waiting。
public class StampedLockDemo1 {

    private static final StampedLock lock = new StampedLock();

    private static final List<Long> DATA = new ArrayList<>();

    public static void main(String[] args) {        
    	new Thread(() -> {
            for (;;) {
                write();
            }       
        }).start();


        IntStream.rangeClosed(1, 10).forEach(item -> {            
        	new Thread(() -> {
                for (;;) {
                    read();
                }            
           }).start();
        });
    }

    private static void read() {
        long stamped = -1;
        try {            
        	stamped = lock.readLock();
            String readData = DATA.stream()    
            		.map(String::valueOf)
                    .collect(Collectors.joining(", ", "R-->", ""));
            Optional.of(readData).ifPresent(System.out::println);
            sleep(2);
        } finally {            
        	lock.unlockRead(stamped);
        }    
    }

    private static void write() {
        long stamped = -1;
        try {            
        	stamped = lock.writeLock();
            long timeMillis = System.currentTimeMillis();
            System.out.println("C-> " + timeMillis);
            DATA.add(timeMillis);
            sleep(2);
        } finally {            
        	lock.unlockWrite(stamped);
        }    
   }

    private static void sleep(long sec) {
        try {
            TimeUnit.SECONDS.sleep(sec);
        } catch (InterruptedException e) {            
        	e.printStackTrace();
        }    
   }
}
  1. StampedLock 乐观读<适合读多写少>
private static void read() {
    long stamped = lock.tryOptimisticRead();
    if (lock.validate(stamped)) {        
    	try {
            stamped = lock.readLock();
            String readData = DATA.stream()                    
            		.map(String::valueOf)
                    .collect(Collectors.joining(", ", "R-->", ""));
            Optional.of(readData).ifPresent(System.out::println);
            sleep(1);
        }finally {            
        	lock.unlockRead(stamped);
        }    
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值