java并发包:读写锁

来源:互联网 发布:知乎手机版怎么用 编辑:程序博客网 时间:2024/05/16 10:59

本文转载至:http://blog.csdn.net/a910626/article/details/51900954

ReadWriteLock是jdk5中提供的读写分离锁。读写分离锁可以有效的帮助减少锁竞争,以提升性能。用锁分离的机制来提升性能非常容易理解,比如线程A1,A2,A3进行写操作,B1,B2,B3进行读操作,如果使用重入锁或者内部锁,则理论上说所有读之间、读和写之间、写和写之间都是串行操作。当B1进行读取时,B2,B3则需要等待锁的释放。由于读操作并不对数据的完整性造成破坏,这种等待显然是不合理。因此,读写锁就有了发挥功能的余地。

  在这种情况下,读写锁允许多个线程同时读,使得B1,B2,B3之间真正并行。但是,考虑到数据完整性,写写操作和读写操作间仍然是需要相互等待和持有锁的。总的来说,读写锁的访问约束如下:

  如果在系统中,读操作次数远远大于写操作,则读写锁就可以发挥最大的功效,提升系统的性能。

一个例子

/** * Created by niehongtao on 16/7/12. * 读写锁 */public class ReadWriteLockDemo {    private static ReentrantReadWriteLock reentrantReadWriteLock =            new ReentrantReadWriteLock();    private static Lock readLock = reentrantReadWriteLock.readLock();    private static Lock writeLock = reentrantReadWriteLock.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 writeRunnalbe = 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(writeRunnalbe).start();        }    }}


0 0