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(); }
这样逻辑既简单明了,又写起来方便。