1. 程式人生 > >可重入鎖的獲取和釋放須要註意的一點兒事

可重入鎖的獲取和釋放須要註意的一點兒事

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方法(代碼塊),就是

一次完整的鎖獲取和釋放。

可重入鎖的獲取和釋放須要註意的一點兒事