在Java中,處理讀寫沖突的關鍵是使用同步機制來確保數據的一致性和完整性。這里有兩種主要的同步方法:synchronized
關鍵字和java.util.concurrent.locks
包中的鎖(如ReentrantLock
)。
synchronized
關鍵字:synchronized
關鍵字可以用于修飾方法或代碼塊,以確保在同一時刻只有一個線程可以訪問共享資源。當線程進入被synchronized
修飾的方法或代碼塊時,其他線程將被阻塞,直到當前線程釋放鎖。
示例:
public class ReadWriteLockExample {
private int data = 0;
public synchronized void write(int value) {
data = value;
System.out.println(Thread.currentThread().getName() + " wrote: " + data);
}
public synchronized int read() {
System.out.println(Thread.currentThread().getName() + " read: " + data);
return data;
}
}
ReentrantLock
:ReentrantLock
是java.util.concurrent.locks
包中的一個類,它提供了比synchronized
更靈活的鎖定機制。你可以使用ReentrantLock
的lock()
和unlock()
方法來顯式地獲取和釋放鎖。
示例:
import java.util.concurrent.locks.ReentrantLock;
public class ReadWriteLockExample {
private int data = 0;
private ReentrantLock lock = new ReentrantLock();
public void write(int value) {
lock.lock();
try {
data = value;
System.out.println(Thread.currentThread().getName() + " wrote: " + data);
} finally {
lock.unlock();
}
}
public int read() {
lock.lock();
try {
System.out.println(Thread.currentThread().getName() + " read: " + data);
return data;
} finally {
lock.unlock();
}
}
}
這兩種方法都可以處理讀寫沖突,但ReentrantLock
提供了更多的功能,如嘗試獲取鎖(tryLock()
)、定時獲取鎖(tryLock(long timeout, TimeUnit unit)
)和可中斷獲取鎖(lockInterruptibly()
)。在選擇同步方法時,可以根據具體需求和場景來決定使用哪種方法。