Java 学习日志

八:ReadWriteLock 读写锁

2017-08-03  本文已影响0人  知耻而后勇_zjh

ReadWriteLock 是读写分离锁, 使用读写分离锁可以有效的帮助减少锁竞争.因为读操作完全不需要对代码块加锁,而写操作才需要对代码块加锁.所以使用读写锁,使多个读操作真正的并行,而写写操作或者读写操作相互等待.

public class ReadWriteLockDemo {
    private static Lock lock = new ReentrantLock();
    private static ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
    private static Lock readLock = readWriteLock.readLock();
    private static Lock writeLock = readWriteLock.writeLock();
    private int value;

    public Object handleRead(Lock lock) throws InterruptedException{
        try {
            lock.lock();
            //模拟读操作
            Thread.sleep(1000);
            return value;
        }finally {
            lock.unlock();
        }
    }

    public void handleWrite(Lock lock,int index) throws InterruptedException{
        try {
            lock.lock();
            Thread.sleep(1000);
            value = index;
        }finally {
            lock.unlock();
        }
    }

    public static void main(String[] args) {
        ReadWriteLockDemo demo = new ReadWriteLockDemo();
        Runnable readRunnable = new Runnable() {
            @Override
            public void run() {
                try {
                    demo.handleRead(readLock);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };

        Runnable writeRunnable = new Runnable() {
            @Override
            public void run() {
                try {
                    demo.handleWrite(writeLock,new Random().nextInt());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        for (int i = 0; i < 18; i++) {
            new Thread(readRunnable).start();
        }
        for (int i = 18; i < 20; i++) {
            new Thread(writeRunnable).start();
        }
    }
}

上述代码 就是18个读线程并行操作,当然他们和写线程是阻塞的,大概两秒左右就会完成所有操作 如果用普通重入锁代替读写锁 经过测试 大概23秒左右完成操作.

上一篇 下一篇

猜你喜欢

热点阅读