在 Java 中,有以下四種常見的線程同步方式:
1. synchronized 關鍵字:使用 synchronized 關鍵字可以實現對象級別的同步,確保同一時間只有一個線程可以訪問被 synchronized 修飾的代碼塊或方法。當一個線程進入 synchronized 代碼塊時,它會鎖定該對象,其他線程必須等待鎖釋放后才能訪問。
示例:
synchronized (lockObject) {
// 同步的代碼塊
}
// 或
public synchronized void synchronizedMethod() {
// 同步的方法
}
2. ReentrantLock 類:ReentrantLock 是 Java.util.concurrent 包提供的一種可重入的互斥鎖。與 synchronized 相比,ReentrantLock 提供了更多的靈活性,如可中斷鎖、超時鎖等。使用 ReentrantLock 必須顯式地獲取鎖和釋放鎖。
示例:
ReentrantLock lock = new ReentrantLock();
lock.lock();
try {
// 同步的代碼塊
} finally {
lock.unlock();
}
3. Semaphore 信號量:Semaphore 是一種計數信號量,它可以控制同時訪問某個資源的線程數量。通過調用 acquire() 方法獲取許可,release() 方法釋放許可。
示例:
Semaphore semaphore = new Semaphore(1);
semaphore.acquire();
try {
// 同步的代碼塊
} finally {
semaphore.release();
}
4. Condition 條件變量:Condition 是在使用 Lock 對象時提供類似于 wait() 和 notify() 的等待/通知機制。可以使用 Condition 的 await() 方法等待某個條件滿足,signal() 方法喚醒等待的線程。
示例:
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
lock.lock();
try {
while (!conditionMet) {
condition.await();
}
// 同步的代碼塊
} finally {
lock.unlock();
}
這些線程同步方式可以幫助解決多線程并發訪問共享資源時的競態條件和數據不一致問題。選擇適當的同步方式取決于具體的需求和場景,需要根據實際情況進行選擇。