设计模式-单例模式

单例模式(Singleton pattern) 是一种常见的设计模式,常见的有两种写法:饿汉式单例、懒汉式单例。

单例模式定义

确保一个类只有一个实例,并提供一个全局访问点。

饿汉式单例

饿汉式单例,构造方法私有化,类加载的同时创建实例,代码如下:

 1 public class MyClass {
 2     
 3     private static MyClass instance = new MyClass();
 4 
 5     private MyClass() {}
 6 
 7     public static MyClass getInstance() {
 8         return instance;
 9     }
10 
11     // 测试
12     public static void main(String[] args) {
13         MyClass m1 = MyClass.getInstance();
14         MyClass m2 = MyClass.getInstance();
15         System.out.println(m1 == m2);
16     }
17 }
18 
19 // 输出结果:
20 // true

懒汉式单例

懒汉式单例同样将构造方法私有化,只是在第一次调用类的时候才创建实例,代码:

 1 public class MyClass {
 2     
 3     private static MyClass instance;
 4 
 5     private MyClass() {}
 6 
 7     public static MyClass getInstance() {
 8         if(instance == null) {
 9             instance = new MyClass();
10         }
11         return instance;
12     }
13 }

懒汉式单例有个问题,就是多线程并发访问时,可能会出错,创建出多个实例对象;当然,我可以用“synchronized”关键字修饰 getInstance方法,强制每个线程进入这个方法之前,要先等别的线程离开该方法,确保不出错;但是,这会降低性能,而且,只有第一次执行该方法时 才需要同步;所以在使用时,如果确实有高并发的情况,建议用饿汉式编写代码。也可以用双重检查加锁的方式,首先检查是不是已经创建了实例,如果未创建,再 进行同步。代码:

public class MyClass {
    
    private volatile static MyClass instance;

    private MyClass() {}
    
    public static MyClass getInstance() {
        if(instance == null) {
            synchronized (MyClass.class) {
                if(instance == null) {
                    instance = new MyClass();
                }
            }
        }
        return instance;
    }
}
原文地址:https://www.cnblogs.com/LikeStar/p/5655758.html