单例模式
一、七种单例模式写法
- 单例模式 : 保证全局过程中只存在一个唯一实例的模式 。
第一种: 饿汉式
- 饿汉式相对于 懒汉式消耗内存的 。
代码
class Task{ //在定义这个对象的时候并且给值的形式--- 饿汉式 private static Task t = new Task(); //构造函数私有化 private Task() { } public static Task getInstanse(){ return t; } }
第二种: 饿汉式变种
代码
class Task{ private static Task t; static{ t = new Task(); } public static Task getInstanse(){ return t; } }
第三种: 懒汉式
- 相对于饿汉式而言 , 线程不安全
代码
class Task_02{ private static Task_02 t; private Task_02(){ } //在用到的时候才初始化 ---懒汉式 public static Task_02 getInstanse(){ if(t ==null){ t = new Task_02(); } return t; } }
第四种 : 懒汉式 线程安全
- 效率低 , 99%的情况下不需要同步
代码:
class Task_02{ private static Task_02 t; private Task_02(){ } //在用到的时候才初始化 ---懒汉式 public static synchronized Task_02 getInstanse(){ if(t ==null){ t = new Task_02(); } return t; } }
第五种: 静态内部类
- 即使类被加载也不会被实例化 , 只有真正被使用时才会被初始化。
代码:
public class SingletonDemo{ private static class Task_02{ private static Task_02 t; private Task_02(){ } //在用到的时候才初始化 ---懒汉式 public static Task_02 getInstanse(){ if(t ==null){ t = new Task_02(); } return t; } } }
第六种: 枚举
- 这是一种被提倡的方式 , 不仅能避免多线程安全问题 , 还能防止反序列化重新创建新的对象。
代码:
public enum SingletonDemo{ INSTANSE; public void whateverMethod(){} }
第七种: 双重校验锁
- 必须在JDK1.5之后才能看到正常的单例效果
代码:
class Task_02{ private static Task_02 t; private Task_02(){ } //在用到的时候才初始化 ---懒汉式 public synchronized static Task_02 getInstanse(){ if(t ==null){ synchronized(Singleton.class){ if(t == null){ t = new Task_02(); } } } return t; } }