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