一、单例模式介绍
单例模式属于创建型模式,它提供了一种创建对象的最佳方式;
1、目的:单例模式涉及到单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。
这个类提供了一种访问其唯一对象的方式,可以直接访问,不需要实例化该类的对象;
2、主要解决:一个全局使用的类频繁地创建与销毁
3、如何解决:判断系统是否已经有这个实例化对象,如果有直接返回,如果没有则创建;
4、核心:构造函数要求是私有的 private,这样该类就不会被实例化;
5、优点:
[1]在内存中只有一个实例,减少了内存开销,尤其是频繁地创建和销毁实例
[2]避免对资源的多重占用
二、实现方式
1、懒汉方式
(1)线程不安全的懒汉式
1 public class Singleton{ 2 private static Singleton instance = null; 3 4 private Singleton(){} 5 6 public static Singleton getInstance(){ 7 8 if(instance == null){ 9 // JVM 重排序导致的空指针问题; 10 // 1.在堆中开辟内存空间 11 // 2.在堆内存中实例化Singleton(); 12 // 3.把对象指向堆空间; 13 // 由于jvm存在乱序执行功能,所以可能在2还没执行时就先执行了3,如果此时再被切换到线程B上,由于执行了3,INSTANCE 已经非空了,// 会被直接拿出来用,这样的话,就会出现异常。这个就是著名的DCL失效问题。 14 15 instance = new Singleton(); 16 } 17 18 return instance; 19 } 20 21 }
特性:1、延迟加载 2、非线性安全
(2)线程安全方式
1 public class Singleton { 2 private static Singleton instance = null; 3 /** 4 * 私有化构造器,这样该类就不会被实例化; 5 * ; 6 */ 7 private Singleton() { 8 9 } 10 11 public static synchronized Singleton getInstance() { 12 if (instance == null) { 13 instance = new Singleton(); 14 } 15 return instance; 16 } 17 }
特性:
延迟加载
线程安全
效率低下 : 必须加锁 synchronized 才能保证单例,但加锁会影响效率
避免内存浪费 :第一次调用才初始化,避免了内存浪费;
2、饿汉式
1 public class Singleton { 2 3 private static Singleton instance = new Singleton(); 4 5 /** 6 * 私有化构造器,这样该类就不会被实例化; 7 * ; 8 */ 9 private Singleton() { 10 } 11 12 public static Singleton getInstance() { 13 return instance; 14 } 15 }
特性:1、线程安全 2、存在内存泄漏的风险
原文:https://www.cnblogs.com/kadaj174/p/10903391.html