package com.jn.learning.javalearning.singleton;
/**********************************************************************************************
* *
* Written by TankPush (Jn)
*
* Description:
* DCL双重检测单例
* volatile: ①保证线程可见性 ②防止指令重排序
* 线程安全
* *
***********************************************************************************************/
public class Singleton_DCL_V1 {
//静态成员变量,必须加volatile
private static volatile Singleton_DCL_V1 instance = null;
//构造器私有化
private Singleton_DCL_V1(){}
//提供获取实例的方法,用类.方法的方式,所以提供静态方法
public static Singleton_DCL_V1 getInstance(){
//该处null判断,主要作用是提升性能。
// 因为如果没有该处判断,会直接去获取锁对象(可能会经过系统内核申请,耗资源和性能,因为锁有多个状态:偏向锁->轻量级锁->重量级锁),再判断是否已经创建对象
if (instance == null) {
//将当前类作为锁对象,获取该锁后执行该部分范围的代码逻辑
synchronized (Singleton_DCL_V1.class) {
if (instance == null) {
instance = new Singleton_DCL_V1();
}
}
}
return instance;
}
public static void main(String[] args) {
Singleton_DCL_V1 instance1 = Singleton_DCL_V1.getInstance();
Singleton_DCL_V1 instance2 = Singleton_DCL_V1.getInstance();
System.out.println(instance1 == instance2);
}
}
单例设计模式(DCL:双重检锁、懒汉式)
最新推荐文章于 2022-06-08 22:52:09 发布