Double-checked locking is an incorrect idiom that does not achieve the intended effect.
Many talented individuals have spent a great deal of time pondering ways to make double-checked locking work in order to improve performance. None have succeeded.
Example 1: At first blush it may seem that the following bit of code achieves thread safety while avoiding unnecessary synchronization.
if (fitz == null) {
synchronized (this) {
if (fitz == null) {
fitz = new Fitzer();
}
}
}
return fitz;
Fitzer()
object is ever allocated, but does not want to pay the cost of synchronization every time this code is called. This idiom is known as double-checked locking.Fitzer()
objects can be allocated. See The "Double-Checked Locking is Broken" Declaration for more details [1].
[1] Standards Mapping - Common Weakness Enumeration - (CWE) CWE ID 609
[2] D. Bacon et al. The "Double-Checked Locking is Broken" Declaration