首页 > 其他分享 >单例模式

单例模式

时间:2023-08-13 22:24:15浏览次数:30  
标签:Singleton private uniqueInstance static 模式 单例 Singleton1 class

双重锁

解释

  • 双重if是需要的。
    如果只有一重,还是可能初始化两次
  • valatile是要得。

uniqueInstance = new Singleton(); 这段代码其实是分为三步执行:

  1. 为 uniqueInstance 分配内存空间
  2. 初始化 uniqueInstance
  3. 将 uniqueInstance 指向分配的内存地址
    但是由于 JVM 具有指令重排的特性,执行顺序有可能变成 1>3>2。指令重排在单线程环境下不会出现问题,但是在多线程环境下会导致一个线程获得还没有初始化的实例。例如,线程 T1 执行了 1 和 3,此时 T2 调用 getUniqueInstance() 后发现 uniqueInstance 不为空,因此返回 uniqueInstance,但此时 uniqueInstance 还未被初始化。

使用 volatile 可以禁止 JVM 的指令重排,保证在多线程环境下也能正常运行。


        if (uniqueInstance == null) {
            synchronized (Singleton.class) {
                    uniqueInstance = new Singleton();
            }
        }

public class Singleton {
    private volatile static Singleton uniqueInstance;

    private Singleton() {
    }
    public static Singleton getUniqueInstance() {
        if (uniqueInstance == null) {
            synchronized (Singleton.class) {
                if (uniqueInstance == null) {
                    uniqueInstance = new Singleton();
                }
            }
        }
        return uniqueInstance;
    }
}

静态内部类


//静态内部类加载时不会加载。
//只有调用时,才会调用。
//这种方式不仅具有延迟初始化的好处,由jvm只初始一个
package com.java.design.pattern;

//静态内部类
//由jvm只初始一个
public class Singleton1 {
    private Singleton1(){}
    private static class SingletonHolder{
        private static final Singleton1 INSTANCE=new Singleton1();
    }
    public static Singleton1 getUniqueInstance(){
        return SingletonHolder.INSTANCE;
    }
}

标签:Singleton,private,uniqueInstance,static,模式,单例,Singleton1,class
From: https://www.cnblogs.com/tangdatou/p/17627395.html

相关文章

  • docker网络 bridge 与overlay 模式
    转载请注明出处:1.bridge网络模式工作原理: 在Bridge模式中,Docker通过创建一个虚拟网络桥接器(bridge)将容器连接到主机上的物理网络接口。每个容器都会被分配一个IP地址,使得它们可以相互通信,并且可以与主机进行通信。Docker的Bridge网络模式是默认的网络配置选项,它提供了容......
  • 问题排查Hive本地计算模式失败
    问题排查Hive本地计算模式失败查看hive.log后发现是javaspaceheap,也就是java内存溢出。解决方案:配置yarn集群的资源分配。由于是本地计算,因此container一定是申请在本地的,限制AM申请container容器资源的大小很重要。机器节点的资源可用通过配置NodeManager,所以第一步是......
  • 问题排查Hive本地计算模式失败
    问题排查Hive本地计算模式失败查看hive.log后发现是javaspaceheap,也就是java内存溢出。解决方案:配置yarn集群的资源分配。由于是本地计算,因此container一定是申请在本地的,限制AM申请container容器资源的大小很重要。机器节点的资源可用通过配置NodeManager,所以第一步是......
  • 12 享元模式 -- go语言设计模式
    享元模式(FlyweightPattern)是一种结构型设计模式,用于有效地支持大量细粒度对象的共享。享元模式通过共享对象的方式来减少内存使用和提高性能。享元模式的实现代码packagemainimport("fmt""sync")/*业务场景描述:-租车场景,客户像车行租车,如果车行有车直接租......
  • 装饰器模式和静态代理模式的区别
    核心点是要增强的对象,代理模式是代理类内部new出来的,装饰器模式是外部传进来的。https://www.bilibili.com/video/BV1Np4y1z7BU?p=74&vd_source=46d50b5d646b50dcb2a208d3946b1598......
  • 代理模式的理论与实现
    本文实践代码仓库:https://github.com/goSilver/my_practice目录一、定义二、作用三、实现3.1代理模式的原理与实现3.2动态代理的原理与实现一、定义代理模式是一种结构型设计模式,它允许通过创建一个代理对象来控制对另一个对象的访问。代理模式在不改变原始对象的情况下,提......
  • 建造者模式的理论与实现
    本文实践代码仓库:https://github.com/goSilver/my_practice目录一、定义二、作用三、实现四、总结一、定义建造者模式是一种创建复杂对象的设计模式。它将一个复杂对象的构建过程分解为多个简单的步骤,并且允许按照特定的顺序来构建对象。通过使用建造者模式,我们可以将对象的......
  • 工厂模式的理论与实践
    本文实践代码仓库:https://github.com/goSilver/my_practice目录一、定义二、作用三、实现3.1简单工厂3.2工厂方法3.3简单工厂和工厂方法如何选择?3.4抽象工厂四、总结一、定义工厂模式是一种创建对象的设计模式。它提供了一种统一的接口来创建对象,而不需要直接使用构造函......
  • 不得不懂的技能——混合模式
    构造出一种烟雾缭绕的噶秘诀点这个按钮打开混合模式模式选择屏幕,就是滤色效果如果有一种灰蒙蒙的感觉复制一个副本,混合模式柔光如果觉得过度了,把不透明度降下来就好了......
  • 单例模式的理论与实现
    本文实践代码仓库:https://github.com/goSilver/my_practice目录一、定义二、作用三、实现3.1饿汉式3.2懒汉式3.3双重检查3.4静态内部类3.5枚举四、总结4.1单例存在哪些问题?4.2单例有什么替代解决方案?一、定义单例模式是一种创建型设计模式,它确保一个类只有一个实例,并......