标签:Singleton Java 编程 instance 内存 单例 new null
不安全的单例
/**
* 不安全的单例.<br>
* @author gqltt<br>
* @version 1.0.0 2020年4月7日<br>
* @see
* @since JDK 1.5.0
*/
public class Singleton {
// volatile 修饰保证安全.
private static Singleton instance = null;
public static Singleton getInstance() {
// 如果线程A在执行2后切换,线程B进来---bug
if(null == instance) {
synchronized (Singleton.class) {
if(null == instance) {
// new的顺序指令可能导致bug
//1、初始化一块内存M
//2、instance指向内存&M
//3、创建对象
instance = new Singleton();
}
}
}
return instance;
}
}
new 顺序
问题
出在 new 操作上,我们以为的 new 操作应该是:
1、分配一块内存 M;
2、在内存 M 上初始化 Singleton 对象;
3、然后 M 的地址赋值给 instance 变量。
但是实际上优化后的执行路径却是这样的:
1、分配一块内存 M;
2、将 M 的地址赋值给 instance 变量;
3、最后在内存 M 上初始化 Singleton 对象。
解决
instance改为volatile或者final
标签:Singleton,Java,编程,instance,内存,单例,new,null 来源: https://blog.csdn.net/gqltt/article/details/121558409
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。