Code Correctness: Double-Checked Locking
Abstract
Double-checked locking 是一种不正确的用法,并不能达到预期目标。
Explanation
许多才智卓越的人都试图使用 double-checked locking 方法来提高性能,并为此付出了大量的时间, 但是无
一成功。 例 1:乍一看,下列代码似乎既能避免不必要的同步又能保证线程的安全性。
if (fitz == null) { synchronized (this) { if (fitz == null) { fitz = new Fitzer(); } } } return fitz;
程序员希望保证仅分配一个 Fitzer() 对象,但又不希望每次调用该代码时都进行一次同步。 这就是所谓的
double-checked locking 方法。 令人遗憾的是,它并不起作用,并且可以分配多个 Fitzer() 对象。 有关更
多详细信息,请参见 The "Double-Checked Locking is Broken" Declaration [1]。
Recommendation
其实同步所花费的代价比想象中的要少。 许多情况下,最好的方法就是采用最简单的解决方法。
例 2: 例 1
中的代码应该用以下方式重写:
synchronized (this) { if (fitz == null) { fitz = new Fitzer(); } return fitz; }