Double-Checked Locking 双重检查锁问题

2023-04-20,,

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;
}

Double-Checked Locking 双重检查锁问题的相关教程结束。

《Double-Checked Locking 双重检查锁问题.doc》

下载本文的Word格式文档,以方便收藏与打印。