Java.util.concurrent.locks包定义了两个锁类,ReentrantLock和ReentrantReadWriteLock类。

当有很多线程都从某个数据结构中读取数据而很少有线程对其进行修改时,后者就很有用了。在这种情况下,允许读取器线程共享访问是合适的。当然,写入器线程依然必须是互斥访问的

下面是使用读/写锁的必要步骤:

(1) 创建一个ReentrantReadWriteLock对象

  1. private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();

(2)抽取读锁和写锁:

  1. private Lock readLock = rwl.readLock();//得到一个可被多个读操作共用的读锁,但它会排斥所有写操作
  2. private Lock writeLock = rwl.writeLock();//得到一个写锁,它会排斥所有其他的读操作和写操作

(3) 对所有访问者加读锁

  1. public double getTotalBalance(){
  2. readLock.lock();
  3. try{...};
  4. finally{readLock.unlock();}
  5. }
ReentrantReadWriteLock类和ReentrantLock类的区别-LMLPHP

对所有修改者加写锁

    1. public void transfer(){
    2. writeLock.lock();
    3. try{...};
    4. finally{writeLock.unlock();}
    5. }
05-06 23:26