Java中ReentrantLock和Synchronized的區別
有多種方法可以使多個執行緒對共享資源加鎖。一種是可重入鎖 (Reentrant Lock 或 ReadWriteLock),另一種是使用Synchronized方法。
ReentrantLock類從Java 5開始在Java併發包中提供。
它是Lock介面的實現,根據Java文件,Lock介面的實現提供了比使用synchronized方法所能獲得更廣泛的操作。
| 序號 | 關鍵點 | ReentrantLock | Synchronized |
|---|---|---|---|
| 1 | 獲取鎖 | Reentrant lock類提供lock()方法,用於執行緒獲取共享資源的鎖 | 只需要編寫synchronized關鍵字即可獲取鎖 |
| 2 | 釋放鎖 | 要釋放鎖,程式設計師必須呼叫unlock()方法 | 這是隱式完成的 |
| 3 | 中斷能力 | 可以使用lockInterruptibly()方法中斷執行緒 | 無法中斷執行緒 |
| 4 | 公平性 | 此類的建構函式具有公平性引數。如果將其設定為true,則鎖傾向於向等待時間最長的執行緒授予訪問許可權 * 執行緒 | 鎖不保證任何特定的訪問順序 |
| 5 | 鎖釋放順序 | 鎖可以以任何順序釋放 | 鎖應按獲取它們的順序釋放 |
ReentrantLock示例
public class ReentrantLockExample implements Runnable{
private Lock lock=new ReentrantLock();
@Override
public void run() {
try {
lock.lock()
//Lock some resource
}
catch (InterruptedException e) {
e.printStackTrace();
}
finally {
lock.unlock();
}
}
}Synchronized鎖示例
public class SynchronizedLockExample implements Runnable{
@Override
public void run() {
synchronized (resource) {
//Lock some resource
}
}
}
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP