Синхронизация дважды на том же объекте?

takeWhile является одной из функций, предоставляемых библиотекой protonpack .

Stream infiniteInts = Stream.iterate(0, i -> i + 1);
Stream finiteInts = StreamUtils.takeWhile(infiniteInts, i -> i < 10);

assertThat(finiteInts.collect(Collectors.toList()),
           hasSize(10));

49
задан Eli Courtwright 30 October 2008 в 12:13
поделиться

4 ответа

Повторно используемый

Синхронизируемое использование блоков повторно используемый блокировки, что означает, содержит ли поток уже блокировку, он может re-aquire это без проблем. Поэтому Ваш код будет работать, как Вы ожидаете.

Посмотрите нижнюю часть страница Java Tutorial Внутренние Блокировки и Синхронизация .

Для заключения в кавычки с 2015-01†¦

Повторно используемая Синхронизация

Отзыв, что поток не может получить блокировку, принадлежавшую другому потоку. Но поток может получить блокировку, которой он уже владеет. Разрешение потока получить ту же блокировку несколько раз включает повторно используемая синхронизация . Это описывает ситуацию, где синхронизируемый код, прямо или косвенно, вызывает метод, который также содержит синхронизируемый код, и оба набора кода используют ту же блокировку. Без повторно используемой синхронизации синхронизируемый код должен был бы принять много дополнительных мер предосторожности, чтобы не иметь саму причину потока для блокирования.

70
ответ дан Basil Bourque 7 November 2019 в 21:47
поделиться

В Java synchronized ключевое слово на методе в основном синхронизируется на текущем объекте, поэтому в действительности это делает то, что Вы предлагаете выше неявно.

Вы не испытаете проблемы с синхронизацией на одном объекте в одном методе и затем синхронизацией на том же объекте в другом методе, потому что, как Вы говорите, текущий поток уже содержит блокировку на том объекте.

1
ответ дан 7 November 2019 в 21:47
поделиться

Никакие проблемы. В Вашем примере, (как только Вы фиксируете свой код для избавлений от предупреждений компиляции, что Вы доберетесь;)), синхронизация гарантирует, что блоки в method1 и method2 не выполнятся одновременно.

Это - вид точки синхронизации.:)

<час>

Редактирование: Извините, пропущенные части Вашего вопроса, но Phill ответили на него. Подводя итоги, единственный поток не может завести в тупик себя.

1
ответ дан Jack Leow 7 November 2019 в 21:47
поделиться

Нет, второй метод не остановится, если названо сначала. Никакие нечетные результаты не произойдут (кроме небольших издержек для проверки блокировки. Этот вопрос привычки очень. Java 6 вперед, у Вас есть огрубление блокировки в JVM - http://java.sun.com/performance/reference/whitepapers/6_performance.html )

, Например, смотрите на исходный код java.util. Вектор. Существует партия вызовов к другим синхронизированным методам из синхронизированных методов.

0
ответ дан RuntimeException 7 November 2019 в 21:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: