在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()
)。在选择同步方法时,可以根据具体需求和场景来决定使用哪种方法。