单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。
实现思路:为了实现该singleton2只产生一个实例化对象,可以先将其构造函数私有化,杜绝外部new 对象,然后又该类自己提供一个静态的方法,产生对象供外部使用,这样便实现了单例的基本要求.
public class Singleton2 {
private static Singleton2 instance=null;
//将构造函数私有化,杜绝外部new 对象
private Singleton2(){}
public static Singleton2 getInstatnce(){
if(instance==null){
instance = new Singleton2();
}
return instance;
}
}
上面的代码看似实现了单例的要求,但是在多线程的环境下,这样的方式就会有一些问题,getInstance()方法由于在线程竞争的情况下,无法保证 只产生一个对象,所以该方法要加上同步机制。
如果在getInstance()方法上直接加上synchronized,大家称呼为懒汉式,如下代码,虽然解决了多线程的问题,但是每次调用该同步方法的时候,效率不是很好。
public class Singleton2 {
private static Singleton2 instance=null;
//将构造函数私有化,杜绝外部new 对象
private Singleton2(){}
public static synchronized Singleton2 getInstatnce(){
if(instance==null){
instance = new Singleton2();
}
return instance;
}
}
还有一种方式叫饿汉式,即是在类加载的时候即产生一个静态的instance对象,这样也解决了问题,例如
public class Singleton2 {
private static final Singleton2 instance= new Singleton2();
//将构造函数私有化,杜绝外部new 对象
private Singleton2(){}
public static Singleton2 getInstatnce(){
return instance;
}
}
注意,上面的instance加了final关键字,防止外部修改instance变量;这样的方式基本没什么问题,唯一的小遗憾就是这个对象不管你用不用,在类加载的时候就new 出来了,感觉不是十分完美。相对应得还有一种叫双重锁的方式,个人觉得比较完美,代码如下:
public class Singleton {
private static Singleton instance=null;
//将构造函数私有化,杜绝外部new 对象
private Singleton(){}
public static Singleton getInstatnce(){
if(instance==null){
synchronized(Singleton.class){
if(instance==null){
instance = new Singleton();
}
}
}
return instance;
}
}
具体的实现方式还要看具体的项目环境吧!