一、模式定义
单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。
二、分类
(1)懒汉式:延迟加载方式。
(2)饿汉式 :加载时就new出对象,线程安全,没有延时加载的优势。
三、代码实现
1.饿汉式单例(立即加载,线程安全)
1 public class SingletonDemo1 { 2 private static SingletonDemo1 instance = new SingletonDemo1(); 3 4 private SingletonDemo1(){ 5 6 } 7 8 public static SingletonDemo1 getInstance(){ 9 return instance; 10 } 11 }
2.懒汉式单例(延迟加载,使用synchronized同步锁保证只能创建一个实例,但是会降低效率,下一个线程想要获取对象,就必须等待上一个线程释放锁之后,才可以继续运行。)
1 public class SingletonDemo2 { 2 private static SingletonDemo2 instance; 3 private SingletonDemo2(){ 4 5 } 6 7 public static synchronized SingletonDemo2 getInstance(){ 8 if(instance==null){ 9 instance = new SingletonDemo2(); 10 } 11 return instance; 12 } 13 }
3.双重检测锁式(将同步内容放入到if内部,由于编译器优化原因和JVM底层内部模型原因偶尔会出问题,不建议使用)
4.静态内部类式(懒加载:一开始不会初始化静态内部类,只有调用getInstance()时才初始化,类加载过程中天然线程安全,调用效率高)
1 public class SingletonDemo3 { 2 private static class SingletonClassInstance{ 3 private static final SingletonDemo3 instance = new SingletonDemo3(); 4 } 5 6 private SingletonDemo3(){ 7 8 } 9 10 public static SingletonDemo3 getInstance(){ 11 return SingletonClassInstance.instance; 12 } 13 }
5.枚举单例
1 class Resource{ 2 } 3 4 public enum SomeThing { 5 INSTANCE; 6 private Resource instance; 7 SomeThing() { 8 instance = new Resource(); 9 } 10 public Resource getInstance() { 11 return instance; 12 } 13 }