【并发编程】安全发布对象—单例模式升级版(2)

简介: 【并发编程】安全发布对象—单例模式升级版

1.4 volatile+双重同步锁

/**
 * 懒汉模式
 * 线程安全
 */
public class LazyMode4 {
    private LazyMode4(){//私有的构造函数}
    private volatile static LazyMode4 instance = null;
    public static LazyMode4 getInstance(){
        if(instance == null){
            synchronized(LazyMode4.class){
                if(instance == null){
                    instance = new LazyMode4();
                }
            }
        }
        return  instance;
    }
}


屏幕快照 2022-05-10 下午12.51.02.png

屏幕快照 2022-05-10 下午12.51.34.png

2 饿汉模式设计

/**
 * 饿汉模式
 * 线程安全的
 */
public class HungryMode1 {
    private HungryMode1(){//私有的构造函数}
    private static HungryMode1 instance = new HungryMode1();//单例对象
    public static HungryMode1 getInstance(){
        return instance;
    }
}
  • 饿汉模式的不足:如果饿汉模式中存在过多的处理,会导致这个类在加载的时候特别慢,可能会引起性能问题,如果是只进行类的加载,没有实际的调用的话,会导致资源的浪费
  • 所以我们需要考虑的一个点就是肯定会被使用,这样才不会导致过多的浪费,我们来看第二个例子
/**
 * 饿汉模式
 * 单例实例在类装载时进行创建
 */
@ThreadSafe
public class HungryMode2 {
    private HungryMode2(){//私有的构造函数}
    //单例对象
    private static HungryMode2 instance = null;
  //静态代码块
    static {
        instance = new HungryMode2();
    }
    public static HungryMode2 getInstance(){
        return instance;
    }
    public static void main(String[] args) {
//        System.out.println(getInstance());
//        System.out.println(getInstance());
        System.out.println(getInstance().hashCode());
        System.out.println(getInstance().hashCode());
    }
}

在这里呢我们要注意的是:

当我们写单例对象和静态代码块的时候呢,一定要注意他们的顺序,顺序不一样,执行结果会 有所不同

目录
相关文章
|
4月前
|
设计模式 存储 安全
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
61 1
|
4月前
|
设计模式 安全 Java
Java面试题:解释单例模式的实现方式及其优缺点,讨论线程安全性的实现。
Java面试题:解释单例模式的实现方式及其优缺点,讨论线程安全性的实现。
30 0
|
4月前
|
设计模式 存储 缓存
Java面试题:结合单例模式与Java内存模型,设计一个线程安全的单例类?使用内存屏障与Java并发工具类,实现一个高效的并发缓存系统?结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
Java面试题:结合单例模式与Java内存模型,设计一个线程安全的单例类?使用内存屏障与Java并发工具类,实现一个高效的并发缓存系统?结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
37 0
|
4月前
|
存储 安全 Java
Java面试题:Java内存管理、多线程与并发框架:一道综合性面试题的深度解析,描述Java内存模型,并解释如何在应用中优化内存使用,阐述Java多线程的创建和管理方式,并讨论线程安全问题
Java面试题:Java内存管理、多线程与并发框架:一道综合性面试题的深度解析,描述Java内存模型,并解释如何在应用中优化内存使用,阐述Java多线程的创建和管理方式,并讨论线程安全问题
41 0
|
6月前
|
设计模式 安全 Java
Java设计模式—单例模式的实现方式和使用场景
那么为什么要有单例模式呢?这是因为有的对象的创建和销毁开销比较大,比如数据库的连接对象。所以我们就可以使用单例模式来对这些对象进行复用,从而避免频繁创建对象而造成大量的资源开销。
150 1
|
安全 Java
并发编程-09安全发布对象+单例模式详解
并发编程-09安全发布对象+单例模式详解
72 0
并发编程-09安全发布对象+单例模式详解
|
安全 Java 测试技术
工作中单例模式用法及其使用场景?
工作中单例模式用法及其使用场景?
97 0
|
安全
并发编程-08安全发布对象之发布与逸出
并发编程-08安全发布对象之发布与逸出
50 0
|
安全 Java
《JUC并发编程 - 高级篇》06 - 共享模型之不可变(不可变类的设计 | 不可变类的使用 | 享元模式)
《JUC并发编程 - 高级篇》06 - 共享模型之不可变(不可变类的设计 | 不可变类的使用 | 享元模式)
《JUC并发编程 - 高级篇》06 - 共享模型之不可变(不可变类的设计 | 不可变类的使用 | 享元模式)
|
Java API 调度
java多线程之概念和3种创建方式(详解)
进程:一个执行的应用程序 线程:一个应用程序内的具体执行不同模块
117 0
java多线程之概念和3种创建方式(详解)