由于ReadWriteLock存在严重的性能问题,甚至在很多情况下比synchronized要慢,java8新出了StampedLock,这个锁不仅更快,而且它提供强大的乐观锁API,这意味着你能以一个较低的代价获得一个读锁, 在这段时间希望没有写操作发生,当这段时间完成后,你可以查询一下锁,看是否在刚才这段时间是否有写操作发生?然后你可以决定是否需要再试一次 或升级锁或放弃。
悲观用法和ReadWriteLock很类似,try前lock,finally 里unlock。
long stamp = lock.writeLock(); //blocking lock, returns a stamptry { write(stamp); // this is a bad move, you’re letting the stamp escape} finally { lock.unlock(stamp);// release the lock in the same block - way better}先尝试读,读完检查有没有写操作发送,如果有则获取悲观锁并重读。
long stamp = lock.tryOptimisticRead(); // non blockingread();if(!lock.validate(stamp)){ // if a write occurred, try again with a read lock long stamp = lock.readLock(); try { read(); } finally { lock.unlock(stamp); }}新闻热点
疑难解答