第一种,最普遍的,未加锁。
public class Singleton2 { private Singleton2(){ System.out.println("This is Singleton2's instance."); }; private static Singleton2 instance = null; public static Singleton2 getInstance(){ if(instance == null) { instance = new Singleton2(); } return instance; } }
?这种情况未加锁,可能会产生数据错误,比如两个同时新生成的对象,一个把对象数据改变了,而另一个使用的没改变之前的。
?
第二种,加锁。
public class Singleton1 { private Singleton1(){ System.out.println("This is Singleton1's instance."); } private static Singleton1 instance = null; public static Singleton1 getInstance2() { if(instance == null){ //1 synchronized (Singleton1.class) { //2 if(instance == null) { instance = new Singleton1(); } } } return instance; } }
?这种只会在第一次的时候产生阻塞,之后每实例一次对象,就会在第1步时跳过去,在第一次实例的时候,会在第2步那里产生阻塞,以后就不会了,这种最好。
?
第三种,加锁,会产生阻塞。
public class Singleton1 { private Singleton1(){ System.out.println("This is Singleton1's instance."); } private static Singleton1 instance = null; public static synchronized Singleton1 getInstance(){ //1 if(instance == null){ instance = new Singleton1(); } return instance; } }
?多线程的时候会在1这里产生阻塞。
?