StampedLock悲觀鎖樂觀鎖

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);
    }
}

特徵

  1. StampedLock支持三種模式: 寫鎖、悲觀讀和樂觀讀。
  2. 容許多 個線程同時獲取樂觀鎖和悲觀讀鎖。
  3. 只容許一個線程獲取寫鎖,寫鎖和悲觀讀鎖是互斥的。
  4. 使用StampedLock必定不要調用中斷操做,若是須要支持中斷功能,必定使用可中斷的悲觀讀鎖 readLockInterruptibly()和寫鎖writeLockInterruptibly()。
  5. StampedLock裏的寫鎖和悲觀讀鎖加鎖成功以後,都會返回一個stamp;而後解鎖的時候,須要傳入這個 stamp。
  6. StampedLock不支持重入(ReadWriteLock支持)。
  7. StampedLock的悲觀讀鎖、寫鎖都不支持條件變量。
  8. StampedLock支持鎖的降級(經過tryConvertToReadLock()方法實現)和升級(經過 tryConvertToWriteLock()方法實現),可是建議你要慎重使用。

數據庫中的樂觀鎖

  1. 在表中添加一個數值型版本號字段version。
  2. 每次更新表時都將version字段加1。
  3. 修改數據時使用主鍵和version做爲修改條件,version一致則會修改爲功。
  4. 若是修改失敗,經過主鍵查詢獲取最新數據再執行修改。

**** 碼字不易若是對你有幫助請給個關注****線程

**** 愛技術愛生活 QQ羣: 894109590****code

相關文章
相關標籤/搜索