由于ReadWriteLock存在嚴重的性能問題,甚至在很多情況下比synchronized要慢,java8新出了StampedLock,這個鎖不僅更快,而且它提供強大的樂觀鎖API,這意味著你能以一個較低的代價獲得一個讀鎖, 在這段時間希望沒有寫操作發(fā)生,當這段時間完成后,你可以查詢一下鎖,看是否在剛才這段時間是否有寫操作發(fā)生?然后你可以決定是否需要再試一次 或升級鎖或放棄。
悲觀用法和ReadWriteLock很類似,try前l(fā)ock,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}先嘗試讀,讀完檢查有沒有寫操作發(fā)送,如果有則獲取悲觀鎖并重讀。
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); }}新聞熱點
疑難解答