Remember to synchronize when iterating streams from a synchronized Collection
When iterating collections created via Collections.synchronizedList
for instance, you are required
to obtain a lock on the actual list before doing so. So you normally end up with code similar to:
List list = Collections.synchronizedList(new ArrayList());
synchronized (list) {
Iterator i = list.iterator(); // Must be in synchronized block
while (i.hasNext())
foo(i.next());
}
This requirement is documented in the javadocs.
Since lambdas and streams are being more widely used, it is important to remind that when iterating via a stream we also need to obtain a lock on the synchronized collection created.
List list = Collections.synchronizedList(new ArrayList());
synchronized (list) {
list.stream()
.anyMatch(...)
}
Here’s an example from Zalando Nakadi Event Broker.
Happy hacking!
Categories: Blog
Tags: Programming, Java, Opensource