...
The second execution order involves the same operations, just that t2 starts and finishes before t1.
Compliant Solution (cheap read-write lock trick)
It is also permissible to declare flag
as volatile
to ensure its visibility and while doing so, forgoing to synchronize synchronization of the getFlag()
method.
Code Block | ||
---|---|---|
| ||
class Flag { private volatile boolean flag = true; public synchronized void toggle() { flag ^= true; // same as flag = !flag; } public boolean getFlag() { return flag; } } |
The toggle()
method still requires synchronization because it performs a non-atomic operation. However, this advanced technique is brittle in most other scenarios, such as, when a getter method performs operations other than just returning the value of the volatile
field. The cheap read-write lock trick offers performance advantages since the method to read a value getFlag()
is not synchronized. Unless read performance is critical, this method is not recommended.
Compliant Solution (java.util.concurrent.atomic.AtomicBoolean
)
...