在Java中,線程同步是一種機制,用于確保多個線程在訪問共享資源時不會發生沖突。Java提供了以下幾種方法來實現線程同步:
synchronized關鍵字:synchronized是Java中最基本的線程同步機制。它可以用于修飾方法或者代碼塊,確保同一時間只有一個線程可以訪問被保護的資源。
public synchronized void syncMethod() {
// 同步代碼
}
public void syncBlock() {
synchronized (this) {
// 同步代碼
}
}
Lock接口和ReentrantLock類:Java 5引入了Lock接口和ReentrantLock類,它們提供了比synchronized更靈活和強大的線程同步機制。ReentrantLock支持公平鎖和非公平鎖,并提供了比synchronized更豐富的API。
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class LockExample {
private final Lock lock = new ReentrantLock();
public void doSomething() {
lock.lock();
try {
// 同步代碼
} finally {
lock.unlock();
}
}
}
ReadWriteLock接口和ReentrantReadWriteLock類:這是一個讀寫鎖的實現,允許多個線程同時讀取共享資源,但在寫入時會阻塞其他線程的讀寫操作。這適用于讀操作遠多于寫操作的場景,可以提高性能。
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class ReadWriteLockExample {
private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
private final Lock readLock = readWriteLock.readLock();
private final Lock writeLock = readWriteLock.writeLock();
public void read() {
readLock.lock();
try {
// 讀取共享資源
} finally {
readLock.unlock();
}
}
public void write() {
writeLock.lock();
try {
// 寫入共享資源
} finally {
writeLock.unlock();
}
}
}
原子類:Java提供了一些原子類,如AtomicInteger、AtomicLong等,它們內部使用了CAS(Compare-And-Swap)操作來實現線程安全的更新操作。這些類可以用于實現無鎖數據結構。
import java.util.concurrent.atomic.AtomicInteger;
public class AtomicExample {
private final AtomicInteger counter = new AtomicInteger(0);
public void increment() {
counter.incrementAndGet();
}
}
這些是Java中常用的線程同步語法。在實際應用中,根據具體需求選擇合適的同步機制。