Java中为何引入双重检查锁机制?揭秘真相,长文终见分晓!
- 内容介绍
- 文章标签
- 相关推荐
本文共计4641个文字,预计阅读时间需要19分钟。
双重检查锁定与延迟初始化+在Java程序中,有时可能需要延迟一些高开销对象的初始化,并且只有当实际使用这些对象时才进行初始化。此时,程序员可能会采用延迟初始化。但要注意正确实现。
双重检查锁定与延迟初始化
在 java 程序中,有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化。此时程序员可能会采用延迟初始化。但要正确实现线程安全的延迟初始化需要一些技巧,否则很容易出现问题。比如,下面是非线程安全的延迟初始化对象的示例代码:
COPYpublic class UnsafeLazyInitialization { private static Instance instance; public static Instance getInstance() { if (instance == null) //1:A 线程执行 instance = new Instance(); //2:B 线程执行 return instance; } }在 UnsafeLazyInitialization 中,假设 A 线程执行代码 1 的同时,B 线程执行代码 2。此时,线程 A 可能会看到 instance 引用的对象还没有完成初始化(出现这种情况的原因见后文的“问题的根源”)。
对于 UnsafeLazyInitialization,我们可以对 getInstance() 做同步处理来实现线程安全的延迟初始化。
本文共计4641个文字,预计阅读时间需要19分钟。
双重检查锁定与延迟初始化+在Java程序中,有时可能需要延迟一些高开销对象的初始化,并且只有当实际使用这些对象时才进行初始化。此时,程序员可能会采用延迟初始化。但要注意正确实现。
双重检查锁定与延迟初始化
在 java 程序中,有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化。此时程序员可能会采用延迟初始化。但要正确实现线程安全的延迟初始化需要一些技巧,否则很容易出现问题。比如,下面是非线程安全的延迟初始化对象的示例代码:
COPYpublic class UnsafeLazyInitialization { private static Instance instance; public static Instance getInstance() { if (instance == null) //1:A 线程执行 instance = new Instance(); //2:B 线程执行 return instance; } }在 UnsafeLazyInitialization 中,假设 A 线程执行代码 1 的同时,B 线程执行代码 2。此时,线程 A 可能会看到 instance 引用的对象还没有完成初始化(出现这种情况的原因见后文的“问题的根源”)。
对于 UnsafeLazyInitialization,我们可以对 getInstance() 做同步处理来实现线程安全的延迟初始化。

