Java-параллелизм на практике - пример 14.12

<code>// 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.... */
</code>

У меня есть вопрос о примере выше, который извлечен изJava Concurrency in Practice Листинг 14.12. Подсчет семафоров, реализованных с использованием Lock.

Мне интересно, почему мы должны получить блокировку в конструкторе (как показано, вызывается lock.lock ()). Насколько я знаю, конструкторatomic (кроме ссылки, которой удалось избежать), поскольку никакой другой поток не может получить ссылку, следовательно, полу-построенный объект не виден другим потокам. Поэтому нам не нужен синхронизированный модификатор для конструкторов. Кроме того, нам не нужно беспокоиться оmemory visibility а также, пока объект благополучно опубликован.

So, why do we need to get the ReentrantLock object inside the constructor?

Ответы на вопрос(3)

Ваш ответ на вопрос