ReentrantReadWriteLock 读写锁

来源:互联网 发布:人人商城v2 数据字典 编辑:程序博客网 时间:2024/06/13 12:03
/** * 读写锁ReentrantReadWriteLock * 读写分离可以有效地减少锁的竞争 * 在ReentrantLock中如果给读线程加锁,那么写线程就需要等待 * 给写线程加锁,那么读线程就得等待 * 这显然是不合理的,因为读操作不会对数据的完整性破坏。 * 所以在读的次数远远大于写的次数的时候,使用读写锁子 * @author beiyaoyao */public class ReadWriteLockDemo {    private static Lock lock = new ReentrantLock();    private static ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();    private static Lock readLock = reentrantReadWriteLock.readLock();    private static Lock writeLock = reentrantReadWriteLock.readLock();    private int value;    public Object readMission(Lock lock) throws InterruptedException {        try {            //描述读操作            lock.lock();            Thread.sleep(1000);            return value;        } finally {            lock.unlock();        }    }    public void writeMission(Lock lock,int num) throws InterruptedException {        try {            //描述写操作            lock.lock();            Thread.sleep(1000);            value = num;            System.out.println(value);        } finally {            lock.unlock();        }    }    public static void main(String[] args) {        final  ReadWriteLockDemo  readWriteLockDemo = new ReadWriteLockDemo();        //读线程        Runnable readThread = new Runnable() {            @Override            public void run() {                try {                    //两把锁子交替使用//                  readWriteLockDemo.readMission(readLock);                    readWriteLockDemo.readMission(lock);                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        };              //写线程        Runnable writeThread = new Runnable() {            @Override            public void run() {                try {                    //两把锁子交替使用//                  readWriteLockDemo.writeMission(writeLock,new Random().nextInt());                    readWriteLockDemo.writeMission(lock,new Random().nextInt());                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        };              //夸张的例子 读18次        for(int i = 0  ; i < 18 ; i ++){            new Thread(readThread).start();        }        //写2次        for(int i = 0  ; i < 2 ; i ++){            new Thread(writeThread).start();        }           }}

如果使用重入锁,那么这段程序的执行时间在20秒左右
如果使用读写锁,那么这段程序的执行时间在2秒左右

0 0
原创粉丝点击