双重检查锁问题如何有效避免在多线程编程中?
- 内容介绍
- 文章标签
- 相关推荐
本文共计364个文字,预计阅读时间需要2分钟。
代码正确性:双重检查锁定不正确
解释:许多自以为聪明的程序员都尝试使用双重检查锁定方法来提高性能,但实际上这种方法存在缺陷。
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 其实同步所花费的代价比想象中的要少。 许多情况下,最好的方法就是采用最简单的解决方法。本文共计364个文字,预计阅读时间需要2分钟。
代码正确性:双重检查锁定不正确
解释:许多自以为聪明的程序员都尝试使用双重检查锁定方法来提高性能,但实际上这种方法存在缺陷。
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 其实同步所花费的代价比想象中的要少。 许多情况下,最好的方法就是采用最简单的解决方法。
