基本与上一篇的类似,不同的是加锁方式有区别
package instance;
import java.io.Serializable;
public class SingleTon implements Serializable {
// 饿汉模式,构造方法必须私有,才能保证构造方法只有本类能够使用
private SingleTon(){
// if (instance!=null){
// throw new RuntimeException("单例对象不能重复创建");
// }
System.out.println("构造方法执行了,创建单例对象");
}
// 私有构造内部可以调用,创建实例,必须加valatile
private static volatile SingleTon instance = null;
// 获取实例方法
public static SingleTon getInstance() {
if (instance==null){
synchronized(SingleTon.class){
if (instance==null){
instance = new SingleTon();
}
}
}
return instance;
}
}
双检锁模式也可以创建单例对象,需要加两个if(instalce==null)判断和volatile关键词
**为什么内层也需要加if判断?**
如果不加的话,可能在线程A return instance 之前线程B就创建了对象,这样就产生了2个对象
**为什么要加volatile关键词?**
这个问题比较复杂,volatile解决对象创建的可见性和有序性,因为计算机执行命令存在指令重排,对于对象的创建指令有(初始化分配内存空间、执行构造方法、执行成员变量赋值),如果不加volatile关键词,可能导致线程A创建了一个正常对象后,线程B创建的对象只分配了内存和执行构造方法,并没有给对象赋值,没赋值的话线程B创建的对象可能是残缺不完整的,就跟线程A创建的对象不一致,所以必须要加volatile关键词
构造方法执行了,创建单例对象
instance.SingleTon@67424e82
instance.SingleTon@67424e82
发布者:admin,如若转载,请注明出处:https://ai1024.vip/38642.html