Java单例模式分析

2014-11-24 10:09:08 · 作者: · 浏览: 0

今天中午闲着没事,就随便写点关于Java单例模式的。其实单例模式实现有很多方法,这里我将对这些方法进行对比分析:

第一种:

[java]
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;
}
}

这种情况未加锁,可能会产生数据错误,比如两个同时新生成的对象,一个把对象数据改变了,而另一个使用的没改变之前的。
第二种:

[java]
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步那里产生阻塞,以后就不会了,这种相对来说是最好的。
第三种:

[java]
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这里产生阻塞。