我在想,
考虑以下主要示例,它只使用了一个锁:
哪一种实现方式在线程安全方面是正确的?为什么?
ReentrantLock
和ReentrantReadWriteLock
在逻辑上有什么区别。换句话说,是否存在只需要锁定而不需要读/写锁或反之的情况,即读/写锁和锁不足够的情况?考虑以下主要示例,它只使用了一个锁:
public class Counter {
private int counter = 0;
private ReentrantLock lock = new ReentrantLock(true);
public void increment() {
lock.lock();
counter += 1;
lock.unlock();
}
public int getCounter() {
return counter;
}
}
考虑并与之前的示例进行比较,以下是读/写锁示例:
public class Counter {
private int counter = 0;
private ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);
public void increment() {
lock.writeLock().lock();
try {
counter += 1;
} finally {
lock.writeLock().unlock();
}
}
public int getCounter() {
lock.readLock().lock();
try {
return counter;
} finally {
lock.readLock().unlock();
}
}
}
哪一种实现方式在线程安全方面是正确的?为什么?
ReadWriteLock
,读锁是共享的,而写锁是独占的。换句话说,多个线程可以同时读取,只要没有线程在写入并且一个或多个线程正在读取时,没有线程能够写入。当您需要此功能时,请使用ReadWriteLock
。另一方面,Lock
是互斥的。 - SlawLock
不是线程安全的,因为对counter
的读取没有受到Lock
的保护。 - Slaw