1. 程式人生 > >第2章 執行緒與鎖-2.3 超越內建鎖

第2章 執行緒與鎖-2.3 超越內建鎖

內建鎖的缺點:

  • 一個執行緒因為等待內建鎖而進入阻塞之後,就無法中斷該執行緒了;
  • 嘗試獲得內建鎖時,無法設定超時;
  • 獲得內建鎖,必須使用synchronized塊;

synchronized其實是一個語法糖,等價於

synchronized(this){

}

與synchronized不同的是,ReentranLock提供了顯示的lock和unlock方法。

形式如下

Lock lock  = new ReentranLock();
lock.lock();
try{

}finally{
    lock.unlock();
}

可中斷的鎖

使用lockInterruptibly()方法可以讓執行緒中止。

超時

使用trylock()方法可以為加鎖操作設定超時時間。

交替鎖

書中以連結串列為例,對節點單獨加鎖,這樣就不會影響未被操作節點的訪問。
這裡寫圖片描述

條件變數
用於等待某個事件的發生,建議按以下模式使用

ReentrantLock lock = new ReentrantLock();
Condition con = new Condition();

lock.lock();
try{
    while(!<條件為真>)  //如果用if的話可能會造成虛假喚醒
        condition.await();

}finally{
    lock.unlock();
}

原子變數
在Atomic包裡一共有12個類,四種原子更新方式,分別是原子更新基本型別,原子更新陣列,原子更新引用和原子更新欄位。Atomic包裡的類基本都是使用Unsafe實現的包裝類。

原子更新基本型別類

用於通過原子的方式更新基本型別,Atomic包提供了以下三個類:

AtomicBoolean:原子更新布林型別。
AtomicInteger:原子更新整型。
AtomicLong:原子更新長整型。