Я хочу создать java.util.stream.Stream
, который блокирует действия терминала и использует произвольный объект для синхронизации.Методы Stream должны делать это прозрачным способом, чтобы я мог безопасно передать Stream в код, который не знает о синхронизации.
Рассмотрим следующий пример:
void libraryMethod(Stream<Whatever> s) {
for (int i = 0; i < 10000000; ++i) { /* ... */ }
s.filter(Library::foo).forEach(Library::bar);
}
/* Elsewhere in my code */
Set<Whatever> aSet = Collections.synchronizedSet(...);
/* ... */
libraryMethod(new MyBlockingStream<>(set.stream(), set));
Передвыполняя forEach
, я хочу, чтобы блокировка aSet
была получена самой MyBlockingStream и снята только после завершения forEach
.Это должно гарантировать, что я не получу ConcurrentModificationException
s, потому что другие потоки могут захотеть изменить набор.Я не могу использовать synchronized (aSet)
для всего libraryMethod
, потому что это заблокировало бы aSet
гораздо дольше, чем необходимо.
Возможно ли это сделать?Если да, существуют ли какие-либо реализации, которые делают это, или я должен написать это сам?
Примечание: этот вопрос не имеет ничего общего с тем, как Stream выполняет действия - мне все равно, параллельна ли онаили нет.Я знаю, что существуют по сути несинхронизируемые iterator()
и spliterator()
методы.Я тоже не забочусь о них.