.util.concurrent.locks包定义了两个锁类,ReentrantLock和ReentrantReadWriteLock类。
当有很多线程都从某个中读取数据而很少有线程对其进行修改时,后者就很有用了。在这种情况下,允许读取器线程共享访问是合适的。当然,写入器线程依然必须是互斥访问的
下面是使用读/写锁的必要步骤:
(1) 创建一个ReentrantReadWriteLock对象
- private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
(2)抽取读锁和写锁:
- private Lock readLock = rwl.readLock();//得到一个可被多个读操作共用的读锁,但它会排斥所有写操作
- private Lock writeLock = rwl.writeLock();//得到一个写锁,它会排斥所有其他的读操作和写操作
(3) 对所有访问者加读锁
- public double getTotalBalance(){
- readLock.lock();
- try{...};
- finally{readLock.unlock();}
- }
-
- public void transfer(){
- writeLock.lock();
- try{...};
- finally{writeLock.unlock();}
- }