Java 并发问题的处理神器:ReentrantReadWriteLock

java的内存模型有一个原则:线程中变量的修改可能不会立即对其他线程可见。

 

如果是原子操作可以添加volatile关键字,也可以使用Atomic*这组类,但不太方便所以也很少被使用。

我们常用synchronized来解决并发问题,虽然写起来非常方便,但synchronized是不区分读与写都会强制“同步”。

ReentrantReadWriteLock 类就解决了synchronized 的读写区分问题。

我们知道,线程如果当前在做写操作,就应该对变量加一把写锁。此时不允许其他线程读与写。

线程如果当前在做读操作,就应该对变量加一把读锁。此时不允许其他线程写,但是可以允许读。

ReentrantReadWriteLock就是基于此实现的。

 

private MyClass myClass;  //锁的资源  
private final ReadWriteLock lock = new ReentrantReadWriteLock();  
private final Lock r = lock.readLock();  
private final Lock w = lock.writeLock();  

r.lock();  
try {  
    result = myClass.getSomething();  
} catch (Exception e) {  
} finally {  //一定用finally
    r.unlock();  
}  

w.lock();  
try{  
     result = myClass.setSomething("123");  
}finally{  
    w.unlock();  
}  

 

这样逻辑既简单明了,又写起来方便。

 

posted @ 2013-07-05 11:47  林间走寸  阅读(179)  评论(0编辑  收藏  举报