Параллелизм в Java на практике — пример 14.12

// 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()). Насколько я знаю, конструктор является атомарным (за исключением экранированной ссылки), поскольку ни один другой поток не может получить ссылку, следовательно, наполовину сконструированный объект не виден другим потокам. Поэтому нам не нужен модификатор synchronized для конструкторов. Кроме того, нам не нужно беспокоиться о видимости памяти, пока объект безопасно опубликован.

Итак, зачем нам нужно получать объект ReentrantLock внутри конструктора?

15
задан Prince John Wesley 10 May 2012 в 08:48
поделиться