Java设计模式-单例模式

单例模式的定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点!

1.懒汉式单例模式:

 1 public class Singleton {
 2      //懒汉式单例模式
 3     private  static  Singleton instance;
 4 
 5     //将构造方法设置成private,堵死了外界利用new创建此类实例的可能
 6     private Singleton(){};
 7 
 8     //synchronized  单线程可不用同步
 9     public static synchronized  Singleton  getSingleton(){
10 
11         if(instance==null){
12             instance =new Singleton();
13         }
14         return instance;
15     }
16 
17 }
懒汉式单例模式的缺点:1、效率比较低 2.在多线程高并发的情况下,线程不安全。(第一次被引用的时候创建实例)

2.饿汉式单例模式
1     private static Singleton instance = new Singleton();  
2     private Singleton (){}  
3     public static Singleton getInstance() {  
4     return instance;  
5     }  
饿汉式单例模式的缺点:这种静态初始化的方式在自己被加载时就将自己实例化。解决了多线程环境下不安全的问题。无需开发人员显式的编写线程安全代码。

3.双重锁定效验的单例模式:
 1 public class Singleton {
 2     private volatile static Singleton singleton;
 3     private Singleton (){}
 4     public static Singleton getSingleton() {
 5     if (singleton == null) {
 6         synchronized (Singleton.class) {
 7         if (singleton == null) {
 8             singleton = new Singleton();
 9         }
10         }
11     }
12     return singleton;
13     }
14 }

这样方式实现线程安全地创建实例,而又不会对性能造成太大影响。它只是第一次创建实例的时候同步,以后就不需要同步了。

由于volatile关键字屏蔽了虚拟机中一些必要的代码优化,所以运行效率并不是很高,因此建议没有特别的需要不要使用。双重检验锁方式的单例不建议大量使用,根据情况决定。

原文地址:https://www.cnblogs.com/taochen-go/p/9662845.html