Java 并发实践 - 示例 14.12
2022-09-02 13:46:56
// Not really how java.util.concurrent.Semaphore is implemented
@ThreadSafe
public class SemaphoreOnLock {
private final Lock lock = new ReentrantLock();
// CONDITION PREDICATE: permitsAvailable (permits > 0)
private final Condition permitsAvailable = lock.newCondition();
@GuardedBy("lock") private int permits;
SemaphoreOnLock(int initialPermits) {
lock.lock();
try {
permits = initialPermits;
} finally {
lock.unlock();
}
}
/* other code omitted.... */
我对上面的示例有疑问,该示例是从 Java 并发实践清单 14.12 使用 Lock 实现的计数信号量中提取的。
我想知道为什么我们需要在构造函数中获取锁(如图所示,lock.lock()被调用)。据我所知,构造函数是原子的(除了引用转义),因为没有其他线程可以获得引用,因此,半构造对象对其他线程不可见。因此,我们不需要构造函数的同步修饰符。此外,只要对象安全发布,我们也不必担心内存可见性。
那么,为什么我们需要在构造函数中获取 ReentrantLock 对象呢?