Нужно ли синхронизировать объекты, которые гарантируют, что это произойдет раньше? - PullRequest
0 голосов
/ 09 декабря 2010

У меня есть коллекция, которая гарантированно будет видна всем потокам.Однако это не гарантирует видимость состояний элементов, которые хранятся в этой коллекции (например, если у меня есть коллекция StringBuilder (изменяемая, не потокобезопасная), то я должен синхронизировать каждый элемент в коллекции во время записи / чтения, верно?).Итак, что происходит, когда у меня есть коллекция объектов, которые используются для обеспечения самодостаточности (например, countdownlatch).Нужно ли как-то синхронизировать каждый элемент при вызове await / countDown?Код ниже примерно иллюстрирует эту дилемму:

public class SyncQuestion {

final List<CountDownLatch> lathces = new ArrayList<CountDownLatch>();

SyncQuestion() {
    lathces.add(new CountDownLatch(1));
}

public static void main(String[] args) throws InterruptedException {
    final SyncQuestion sync = new SyncQuestion();

    final Thread sleepingThread = new Thread() {
        public void run() {
            for (CountDownLatch latch : sync.lathces) {
                try {
                    latch.await();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        };
    };

    final Thread wakingThread = new Thread() {
        public void run() {
            for (CountDownLatch latch : sync.lathces) {
                latch.countDown();
            }
        };
    };

    sleepingThread.start();
    wakingThread.start();
    sleepingThread.join();
    wakingThread.join();
}

}

Пожалуйста, исправьте мои предположения, если они ошибочны.

Ответы [ 2 ]

3 голосов
/ 09 декабря 2010

A CountDownLatch - это, в основном, оболочка для AbstractQueuedSynchronizer, состояние которой является изменчивым int, который изменяется с помощью Unsafe.compareAndSwapInt (который является атомарной операцией).

Следовательно, в этом конкретном случае, как сказала Кэмерон Скиннер, нет необходимости синхронизировать, потому что это обеспечивает то, что происходит раньше.

1 голос
/ 09 декабря 2010

Я не думаю, что вам нужно вручную синхронизировать в этом случае, потому что защелки внутренне поточнобезопасны.

...