第2章 執行緒與鎖-2.3 超越內建鎖
阿新 • • 發佈:2019-01-06
內建鎖的缺點:
- 一個執行緒因為等待內建鎖而進入阻塞之後,就無法中斷該執行緒了;
- 嘗試獲得內建鎖時,無法設定超時;
- 獲得內建鎖,必須使用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:原子更新長整型。