单例模式指在系统中仅生成一个实例,整个系统中只使用这一个实例,能够减少实例化的操作,即减少系统中new的操作,从而减少内存的使用频率
*单例的模式的核心在于通过一个接口返回唯一的对象实例 首先单例类必须要有一个private构造函数,其次instance成员变量和getInstance()方法必须是static的。 该种方式存在一个缺点,当使用Singleton.doOther(),此时就会实例化Singleton,但是此时并不需要实例化,即无法实现懒加载。如下:
public class Singleton{
private Singleton(){
System.out.println("Singleton is create");
}
private static Singleton instance = new Singleton();
public static Singleton getInstance(){
return instance;
}
public static void doOther(){
System.out.println("do other");
}
}
> *以下这种方法能够实现懒加载,即需要实例化时调用getInstance,如果instance不为空,则返回,如果为空则创建后返回。
但该种方法存在另外一种问题,如果两个线程同时调用getInstance,那么会创建两个LazySingleton,违反了单例模式。
public class LazySingleton{
private LazySingleton(){
System.out.println("LazySingleton is creating");
}
private static LazySingleton instance = null;
public static LazySingleton getInstance(){
if(null == instance){
instance = new LazySingleton();
}
return instance;
}
}
> *通过加同步方法的方式能够解决该问题,即每个线程会进行同步等待锁,这样能够解决线程不安全问题,如下:
public class LazySingleton{
private LazySingleton(){
System.out.println("LazySingleton is creating");
}
private static LazySingleton instance = null;
public static synchronized LazySingleton getInstance(){
if(null == instance){
instance = new LazySingleton();
}
return instance;
}
}
> *但是带来了极大的性能问题,每个线程都会等待锁,就会耗时很长时间,继而继续优化,大部分instance不为空,这时直接返回不会创建instance,name也就不需要同步,如下:
public class LazySingleton{
private LazySingleton(){
System.out.println("LazySingleton is creating");
}
private static LazySingleton instance = null;
public static LazySingleton getInstance(){
if(null == instance){
synchronized (this){
if(null == instance){
instance = new LazySingleton();
}
}
}
return instance;
}
}