public class Singleton
{
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance()
{
if(instance==null)
{
synchronized(Singleton.class)
{
if(instance==null)
{
instance = new Singleton();
}
}
}
return instance;
}
}
instance = new Singleton();
主要会做三件事:
- 申请堆内存
- 填充对象必要信息 + 初始化 + 末尾填充
- 引用指向堆内地址
如果没有 volatile 修饰,可能发生指令重排, 即 1-3-2 的执行顺序,如果在 3 完成、2 未完成这期间,再来一线程 getInstance(),这时这个线程取到的实例就是未初始化的。
另外 volatile 还有线程可见的作用。
以上内容为个人学习总结,如果纰漏,恳请指正,谢谢!
作者:gaga
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于