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));
Синхронизируемое использование блоков повторно используемый блокировки, что означает, содержит ли поток уже блокировку, он может re-aquire это без проблем. Поэтому Ваш код будет работать, как Вы ожидаете.
Посмотрите нижнюю часть страница Java Tutorial Внутренние Блокировки и Синхронизация .
Для заключения в кавычки с 2015-01†¦
Повторно используемая Синхронизация
Отзыв, что поток не может получить блокировку, принадлежавшую другому потоку. Но поток может получить блокировку, которой он уже владеет. Разрешение потока получить ту же блокировку несколько раз включает повторно используемая синхронизация . Это описывает ситуацию, где синхронизируемый код, прямо или косвенно, вызывает метод, который также содержит синхронизируемый код, и оба набора кода используют ту же блокировку. Без повторно используемой синхронизации синхронизируемый код должен был бы принять много дополнительных мер предосторожности, чтобы не иметь саму причину потока для блокирования.
В Java synchronized
ключевое слово на методе в основном синхронизируется на текущем объекте, поэтому в действительности это делает то, что Вы предлагаете выше неявно.
Вы не испытаете проблемы с синхронизацией на одном объекте в одном методе и затем синхронизацией на том же объекте в другом методе, потому что, как Вы говорите, текущий поток уже содержит блокировку на том объекте.
Никакие проблемы. В Вашем примере, (как только Вы фиксируете свой код для избавлений от предупреждений компиляции, что Вы доберетесь;)), синхронизация гарантирует, что блоки в method1 и method2 не выполнятся одновременно.
Это - вид точки синхронизации.:)
<час>Редактирование: Извините, пропущенные части Вашего вопроса, но Phill ответили на него. Подводя итоги, единственный поток не может завести в тупик себя.
Нет, второй метод не остановится, если названо сначала. Никакие нечетные результаты не произойдут (кроме небольших издержек для проверки блокировки. Этот вопрос привычки очень. Java 6 вперед, у Вас есть огрубление блокировки в JVM - http://java.sun.com/performance/reference/whitepapers/6_performance.html )
, Например, смотрите на исходный код java.util. Вектор. Существует партия вызовов к другим синхронизированным методам из синхронизированных методов.