「java双重检测」java双重检查
本篇文章给大家谈谈java双重检测,以及java双重检查对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
Java单例模式双重检验锁的第一次是否为空判断是什么目的
第一次判断是否为空是位了保证是单例,只有初始是空的情况下才可以创建,synchronize里头的if判空是为了避免小概率事件发生,比如当对象还没创建时,有两个线程都通过了外部的判空,进入synchronize入口处,此时由于同步加锁,只有一个线程可以执行synchronize内部的代码(生成了单例对象),当它执行完释放了锁后,第二个线程就进入的synchronize内部的代码,如果此时不再判断一下的话,该对象就再次被创建了。
java单例双重检查锁为什么需要加volatile关键字
已经修改,的确应该加上volatile关键字。不加的情况下,假设两个线程,线程A正在执行instance = new Instance()的操作,而线程B开始执行if(instance==null)的判断,当不存在volatile的时候,因为 new Instance()是一个非原子操作,可能发生无序写入,构造函数可能在整个对象构造完成前执行完毕,线程B可能会看到一个不完整的instance对象,因为java的某些实现会在内存中开辟一片存储对象的区域后直接返回内存的引用,所以线程B判断不为null,而这时候实际上,instance的构造函数还没有执行,从而线程b得到不完整的对象。在 Instance 的构造函数执行之前,会在内存中开辟一片存储对象的区域后直接返回内存的引用,赋值给变量 instance,instance也就可能成为非 null 的,即赋值语句在对象实例化之前调用,此时别的线程得到的是一个还会初始化的对象,这样会导致系统崩溃线程B可能会看到一个不完整的instance对象,因为java的某些实现,所以线程B判断不为null。从而得到不完整的对象。
如何在Java中使用双重检查锁实现单例
public Singleton {
private Singleton instance;
private Singleton() {} // 构造器私有化
public static Singleton getInstance() {
if (instance == null) { // 第一次检查不加锁
synchronized(Singleton.class) { // 加锁
if (instance == null) { // 第二次检查是在加锁的情况下
instance = new Singleton();
}
}
}
return instance;
}
}
java双重检测的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java双重检查、java双重检测的信息别忘了在本站进行查找喔。
发布于:2022-11-24,除非注明,否则均为
原创文章,转载请注明出处。