【发布时间】:2012-05-10 06:29:20
【问题描述】:
// 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 Concurrency in Practice 清单 14.12 Counting Semaphore Implemented Using Lock。
我想知道为什么我们需要在构造函数中获取锁(如图所示 lock.lock() 被调用)。 据我所知,构造函数是 atomic (除了引用转义),因为没有其他线程可以获取引用,因此,半构造对象对其他线程不可见。 因此,我们不需要构造函数的 synchronized 修饰符。 此外,我们也不需要担心内存可见性,只要对象被安全发布即可。
那么,为什么我们需要在构造函数中获取 ReentrantLock 对象呢?
【问题讨论】:
-
我同意,锁定构造函数似乎没有必要。
-
我怀疑这可能是为了遵守
@GuardedBy注释。 -
@ben,@helloworld922,@trutheality:需要锁定。看我的回答。
标签: java multithreading concurrency locking