单例模式
保证应用中有且只有一个实例。
具体写法如下:
1. 饿汉式
//单例调用方式:Singleton.getInstance()
public class Singleton
{
private static Singleton instance=new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
说明:
- 在类加载的时候就完成了同步化,避免了线程的同步问题。
- 缺点是:没用到这个实例的时候也会加载,造成内存的浪费。
2. 懒汉式
实例的延迟加载,在用到这个的实例的时候才会加载,避免内存的浪费。
存在线程安全问题的情况:
// 单例调用方式:Singleton.getInstance() // 情况假设: // 线程A 调用Singleton.getInstance(),判断instance为空,但还未执行instance的实例化 // 这时线程B 对于单例的调用开始判断instance是否为null,结果为null,也同样开始instance的实例化 public class Singleton { private static Singleton instance=null; private Singleton(){} public static Singleton getInstance(){ if(instance==null){ instance=new Singleton(); } return instance; } }
解决线程问题,但效率低
// 单例调用方式:Singleton.getInstance() // 解决线程问题:给getInstance()加上synchronized关键字,但执行效率低 public class Singleton { private static Singleton instance=null; private Singleton(){} public static synchronized Singleton getInstance(){ if(instance==null){ instance=new Singleton(); } return instance; } }
懒汉式的双重校验锁
属于懒汉式最好的写法,保证了:延迟加载和线程安全
public class Singleton { private static Singleton instance=null; private Singleton(){} public static Singleton getInstance(){ if(instance==null){ synchronized(Singleton.class){ if(instance==null){ instance=new Singleton(); } } } return instance; } }
3. 内部类写法
相当于饿汉式的基础上加了延迟加载。静态内部类在Singleton类被装载时并不会立即实例化。
// 单例调用方式:Singleton.getInstance()
public class Singleton
{
private Singleton(){}
private static class SingletonHolder{
private static Singleton instance=new Singleton();
}
public static Singleton getInstance(){
return SingletonHolder.instance;
}
}
4. 枚举写法
呃呃呃,就这么任性!!!
// 单例调用方式:Singleton.instance
public enum Singleton
{
instacne;
private Singleton(){}
}