ReadWriteLock 介绍

ReadWriteLock 允许多个读线程同时访问,但不允许写线程和读线程、写线程和写线程同时访问。相对于排他锁,提高了并发性。在实际应用中,大部分情况下对共享数据的访问都是读操作远多于写操作,这时 ReadWriteLock 能够提供比排他锁更好的并发性和吞吐量。

使用示例

public class Test {
    private ReadWriteLock rwLock = new ReentrantReadWriteLock();
    //写锁
    public void write() {
        rwLock.writeLock().lock();
        try {
            System.out.println(Thread.currentThread().getName()+":写开始!");
            TimeUnit.SECONDS.sleep(1);
            System.out.println(Thread.currentThread().getName()+":写结束!");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            rwLock.writeLock().unlock();
        }
    }
    //读锁
    public void read() {
        rwLock.readLock().lock();
        try {
            System.out.println(Thread.currentThread().getName()+":读开始!");
            TimeUnit.SECONDS.sleep(1);
            System.out.println(Thread.currentThread().getName()+":读结束!");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            rwLock.readLock().unlock();
        }
    }

    public static void main(String[] args) throws Exception{
        Test test = new Test();
        for(int i=1; i<=3; i++) {
           new Thread(() -> {
               test.write();
           }, "Thread-"+i).start();
        }
        for(int i=4; i<=6; i++) {
            new Thread(() -> {
                test.read();
            }, "Thread-"+i).start();
        }
    }
}

结果:
Thread-1:写开始!
Thread-1:写结束!
Thread-2:写开始!
Thread-2:写结束!
Thread-3:写开始!
Thread-3:写结束!
Thread-4:读开始!
Thread-5:读开始!
Thread-6:读开始!
Thread-4:读结束!
Thread-5:读结束!
Thread-6:读结束!

相关文章: