单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
注意:
优点:
缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
使用场景:
注意事项:getInstance() 方法中需要使用同步锁 synchronized (Singleton.class) 防止多线程同时进入造成 instance 被多次实例化(线程不安全)。
//饿汉式 public class SingletonDemo01 { //类加载时,天然线程安全(无延迟加载),无synchronized修饰,效率高 private static SingletonDemo01 s1 = new SingletonDemo01(); //构造器私有 private SingletonDemo01(){}; //方法无同步,调用效率高 public static SingletonDemo01 getInstance() { return s1; }; public void showMsg() { System.out.println("Singleton implement"); } public static void main(String[] args) { SingletonDemo01 s1 = SingletonDemo01.getInstance(); s1.showMsg(); } }
//懒汉式-可延迟加载 资源利用率提高 public class SingletonDemo02 { private static SingletonDemo02 instance; //构造器私有 private SingletonDemo02() { } //synchronized同步,执行效率低,并发效率降低(无synchronized修饰时线程不安全) public static synchronized SingletonDemo02 getInstance() { if(instance == null) { instance = new SingletonDemo02(); } return instance; } }
//双重检测锁式 public class SingletonDemo03 { private volatile static SingletonDemo03 instance; //构造器私有 private SingletonDemo03() {} public static SingletonDemo03 getInstance() { if(instance == null) { synchronized (SingletonDemo03.class) { if(instance == null) { instance = new SingletonDemo03(); } } } return instance; } }
public class SingletonDemo04 { //定义静态内部类 private static class SingletonClassInstance{ private static final SingletonDemo04 instance = new SingletonDemo04(); } //构造器私有 private SingletonDemo04() { } public static SingletonDemo04 getInstance() { return SingletonClassInstance.instance; } }
public enum SingletonDemo05 { //枚举本身就是单例 INSTANCE; //可添加其他操作 public void test() { } }
单例对象、占用资源少、无需延迟加载 |
枚举优于饿汉式 |
单例对象、占用资源多、需延迟加载 |
静态内部类优于懒汉式 |
原文:https://www.cnblogs.com/vincentYw/p/12555141.html