StampedLock java1.8提供的, 性能比ReadWriteLock好.java
final StampedLock sl = new StampedLock(); /** * 悲觀讀鎖 * 與ReadWriteLock的讀鎖類似 * 容許多個線程進行讀操做 * 與寫鎖互斥 **/ //獲取悲觀鎖 long stamp = sl.readLock(); try { //。。。。 }finally { sl.unlockRead(stamp); } /** * 寫鎖 * 與ReadWriteLock的寫鎖類似 * 只容許一個線程進行寫操做 * 與讀鎖互斥 **/ //獲取寫鎖 long stamp1 = sl.writeLock(); try{ //。。。 }finally { //釋放寫鎖 sl.unlockWrite(stamp1); } /** * 樂觀讀鎖升級爲悲觀讀 * 鎖的嚴苛程度變強叫作升級,反之叫作降級 **/ //獲取樂觀鎖 long stamp = sl.tryOptimisticRead(); //判斷執行讀操做期間,是否存在寫操做,若是存在則sl.validate返回false if (!sl.validate(stamp)){ //升級爲悲觀鎖 stamp = sl.readLock(); try{ //。。。 }finally { //釋放悲觀讀鎖 sl.unlockRead(stamp); }
StampedLock提供的樂觀讀,是容許一個線程獲取寫鎖的,也就是說不是全部的寫操做都是被阻塞的。數據庫
樂觀讀和樂觀鎖是不同的,樂觀讀這個操做是無鎖的,樂觀讀認爲讀的時候不會有寫的操做。性能
import java.util.concurrent.locks.StampedLock; /** * 悲觀鎖樂觀鎖 **/ public class Point { private int x; private int y; final StampedLock sl = new StampedLock(); //計算到原點的距離 int distanceFromOrigin() throws Exception{ //樂觀鎖 long stamp = sl.tryOptimisticRead(); //讀入局部變量,讀的過程數據可能被修改 int curX = x; int curY = y; //判斷執行讀操做期間,是否存在寫操做,若是存在則sl.validate返回false if (!sl.validate(stamp)){ //升級爲悲觀鎖 stamp = sl.readLock(); try{ curX = x; curY = y; }finally { //釋放悲觀讀鎖 sl.unlockRead(stamp); } } return (int)Math.sqrt(curX*curX + curY*curY); } }
**** 碼字不易若是對你有幫助請給個關注****線程
**** 愛技術愛生活 QQ羣: 894109590****code