Iteration Over Non-Concurrent Collection Without Synchronization
ID |
java.concurrent_collection_iteration |
Severity |
high |
Remediation Complexity |
trivial |
Remediation Risk |
low |
Remediation Effort |
low |
Resource |
Reliability |
Language |
Java |
Tags |
CWE:362, concurrency, reliability |
Description
Reports enhanced-for loops that iterate over a field whose declared type is a standard (non-concurrent) collection (ArrayList, HashMap, HashSet, etc.) outside a synchronized block. Iterating while another thread modifies the collection throws ConcurrentModificationException or silently produces corrupted results.
Rationale
Standard Java collections are not thread-safe. The fail-fast iterators used by ArrayList, HashMap, etc. detect concurrent structural modification and throw ConcurrentModificationException, but this detection is best-effort: silent data corruption is also possible.
// Bad -- if another thread adds to 'items', ConcurrentModificationException
private ArrayList<String> items = new ArrayList<>();
public void process() {
for (String item : items) {
handle(item);
}
}