...
Noncompliant Code Example (partial initialization)
ThreadClasses with thread-safe sub-objects (which may not be strictly immutable) must declare their not use nonfinal and nonvolatile fields as volatile
to ensure that no thread sees any field references before the sub-objects' initialization has concluded. This noncompliant code example does not declare the map
field as volatile
or final
.
Code Block | ||
---|---|---|
| ||
public class Container<K,V> { Map<K,V> map; public Container( void initialize() { if(map == null) { map = new HashMap<K,V>(); // Put values in HashMap} } public V get(Object k) { if(map != null) { return map.get(k); } else { return null; } } } |
Compliant Solution (proper initialization)
This compliant solution declares the map
field as volatile
to ensure other threads see an up-to-date HashMap
reference and object state.
Code Block | ||
---|---|---|
| ||
public class Container<K,V> { volatile Map<K,V> map; // ... } |
...