ReadWriteLock

来源:互联网 发布:电脑音乐制作软件 编辑:程序博客网 时间:2024/05/21 07:04
读写锁的好处是读写分离了,如果一个程序大量的操作都是读的话会比重入锁快很多
  • 读-读:不互斥,不阻塞
  • 读-写:互斥,读时不能写,写不能读
  • 写-写:互斥
  • -

如果这段代码使用重入锁可能需要20秒

public class ReadWriteLockDemo  {    private static ReentrantLock lock=new ReentrantLock();//重入锁    private static ReentrantReadWriteLock readWriteLock=new ReentrantReadWriteLock();//读写锁    //通过readWriteLock创建ReadLock    private static ReadLock readLock=readWriteLock.readLock();    //通过readWriteLock创建writeLock    private static WriteLock writeLock=readWriteLock.writeLock();    private int value;    //每读一次需要一秒    public int read(Lock lock) throws InterruptedException{        try {            lock.lock();            Thread.sleep(1000);            return value;        }  finally {            lock.unlock();        }    }    public void write(Lock lock,int i) throws InterruptedException{        try {            lock.lock();            Thread.sleep(1000);            System.out.println("writing");            value=i;        }  finally {            lock.unlock();        }    }    public static void main(String[] args) throws InterruptedException {            final ReadWriteLockDemo rwd = new ReadWriteLockDemo();            Runnable read = new Runnable() {                @Override                public void run() {                    try {                        System.out.println(rwd.read(readLock));//                      System.out.println(rwd.read(lock));                    } catch (InterruptedException e) {                        // TODO Auto-generated catch block                        e.printStackTrace();                    }                }            };            Runnable write = new Runnable() {                @Override                public void run() {                    try {//                      rwd.write(lock, new Random().nextInt(100));                        rwd.write(writeLock, new Random().nextInt(10));                    } catch (InterruptedException e) {                        // TODO Auto-generated catch block                        e.printStackTrace();                    }                }            };            for (int i = 0; i < 18; i++) {                new Thread(read).start();                if(i==5){                    new Thread(write).start();                }            }    }}
0 0
原创粉丝点击