可重入鎖的獲取和釋放須要註意的一點兒事
阿新 • • 發佈:2017-05-19
style 能夠 public 獲取 post 不能 lock stat exec
什麽是可重入鎖,不可重入鎖呢?"重入"字面意思已經非常明顯了,就是能夠又一次進入。可重入鎖,就是說一個線程在
獲取某個鎖後,還能夠繼續獲取該鎖,即同意一個線程多次獲取同一個鎖。比方synchronized內置鎖就是可重入的
,假設A類有2個synchornized方法method1和method2,那麽method1調用method2是同意的。
顯然重入鎖給編程帶
來了極大的方便。假如內置鎖不是可重入的,那麽導致的問題是:1個類的synchornized方法不能調用本類其它
synchornized方法,也不能調用父類中的synchornized方法。與內置鎖相應,JDK提供的顯示鎖ReentrantLock也是可
以重入的,這裏主要說下可重入鎖的釋放須要的事兒。
public static void main(String[] args) throws Exception { final ReentrantLock lock = new ReentrantLock(); Thread t = new Thread(new Runnable() { @Override public void run() { lock.lock(); System.out.println("execute"); lock.unlock(); } }); lock.lock(); lock.lock(); t.start(); Thread.sleep(200); System.out.println("realse one once"); lock.unlock(); }
上面的代碼會出現死鎖。由於主線程2次獲取了鎖,可是卻僅僅釋放1次鎖,導致線程t永遠也不能獲取鎖。一個線程獲
取多少次鎖,就必須釋放多少次鎖。這對於內置鎖也是適用的,每一次進入和離開synchornized方法(代碼塊),就是
一次完整的鎖獲取和釋放。
可重入鎖的獲取和釋放須要註意的一點兒事