单例模式就是采取一定方法保证在整个软件系统中,对于某个类只能存在一个对象的实例,并且该类只提供一个取得其对象实例的方法。属于创建型。
优点
- 在内存里只有一个实例,减少了内存开销
- 可以避免对资源的多重占用
- 设置全局访问点,严格控制访问
单例的实现
懒汉式
/**
* 懒汉式单例模式
* (在多线程下不能保证创建的实例是唯一的)
*/
public class LazySingleton {
private LazySingleton(){}
//和饿汉式不同,这里不实例化,而是在需要的时候再去new
private static LazySingleton instance;
//在多线程下不能保证创建的实例是唯一的
public static LazySingleton getInstance(){
if(instance==null){
instance = new LazySingleton();
}
return instance;
}
}
懒汉式改进(线程安全)
/**
* 懒汉式改进 线程安全的单例模式
*/
public class SynchronizedSingleton {
private SynchronizedSingleton(){}
//和饿汉式不同,这里不实例化,而是在需要的时候再去new
private static volatile SynchronizedSingleton instance;
//双重加锁
public static SynchronizedSingleton getInstance(){
if(instance == null){
synchronized (SynchronizedSingleton.class){
if(instance == null){
instance = new SynchronizedSingleton();
}
}
}
return instance;
}
}
使用synchronized保证创建单例对象时的线程安全,使用volatile修饰instance,防止在执行instance = new SynchronizedSingleton()时候发生指令重排序带来线程安全问题。
静态内部类
大专栏 设计模式:单例模式ss="line-numbers language-java">
public class InnerClassSingleton {
public static InnerClassSingleton getInstance(){
return Singleton.singleton;
}
private static class Singleton{
private static InnerClassSingleton singleton = new InnerClassSingleton();
}
private InnerClassSingleton(){}
}
饿汉式
/**
* 饿汉式单例模式
*/
public class HungrySingleton {
//将构造函数私有化,不允许外部对象直接调用
private HungrySingleton(){}
private static final HungrySingleton instance = new HungrySingleton();
//对外提供唯一用于获取实例的方法
public static HungrySingleton getInstance(){
return instance;
}
}
枚举实现单例
public enum EnumSingleton {
INSTANCE;
}
来源:https://www.cnblogs.com/liuzhongrong/p/12289600.html