单例模式的线程安全形式

这篇具有很好参考价值的文章主要介绍了单例模式的线程安全形式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.单例设计模式的概念

2.实现方法:

1.饿汉式

2.懒汉式

3.区分饿汉式和懒汉式:

3.单例模式的双重校验线程安全形式

1.线程安全问题的解决方法

1.1 synchronized关键字:

1.2 volatile关键字:

        保证变量可见性(不保证原子性)

        禁止指令的重排序

2.线程安全的单例模式的代码实现

PS.什么是指令的重排序


1.单例设计模式的概念

        单例:只能存在一个对象实例

        设计模式:大量实践中总结和理论化后优选的代码结构编码风格。就像是一些固定套路

2.实现方法:

1.饿汉式

        1.私有化类的构造器

        2.内部创建类的私有静态对象

        3.提供类的对象的静态get方法

#饿汉式
public class singleTonHungry {

    //1.私有化类的构造器
    private singleTonHungry(){
    }

    //2.内部创建类的对象
    private static singleTonHungry singleTonHungry = new singleTonHungry();

    //3.提供静态方法返回
    private static singleTonHungry getSingleTonHungry(){
        return singleTonHungry;
    }

}

2.懒汉式

        1.私有化类的构造器

        2.声明当前类的对象:null

        3.声明一个public、static的方法返回当前类对象的方法

#懒汉式
public class singleTonLazy {

    //1.私有化类的构造器
    private singleTonLazy(){
    }

    //2.创建对象私有化
    private static singleTonLazy singleTonInstance;

    //3.静态方法返回
    public static singleTonLazy getInstance(){
        if (null == singleTonInstance){
            singleTonInstance = new singleTonLazy();
        }
        return singleTonInstance;
    }

}

3.区分饿汉式和懒汉式:

        1.懒汉式:好处:延迟对象创建

                          坏处:线程不安全,到多线程内容时,再修改。

        2.饿汉式: 好处:是线程安全的

                          坏处:对象在内存中加载时间过长
 

3.单例模式的双重校验线程安全形式

1.线程安全问题的解决方法

1.1 synchronized关键字:

        synchronized译为:使同步

        synchronized(同步监视器){需要被同步代码}

        同步监视器,俗称锁;任何类的对象都可以充当锁;

1.2 volatile关键字:

        volatile译为:不稳定的

        保证变量可见性(不保证原子性)

                使用volatile修饰的变量,是共享且不稳定的,使用时从主存中读取改变量

        禁止指令的重排序

                在对volatile修饰的变量进行读写操作时,能够防止JVM指令重排序

2.线程安全的单例模式的代码实现

public class singleTon{

    private singleTon(){
    }
    
    //为实例加上volatile关键字
    private volatile static singleTon singleTonInstance;

    public static singleTon getSingleTonInstance(){
        if(null == singleTonInstance){
            //加上synchronize锁
            synchronized(singleTon.class){
                 singleTonInstance = new singleTon();
            }
        }
        return singleTonInstance;    
    }
}

PS.什么是指令的重排序

2.1 指令

        计算机执行操作的命令,比如算术运算指令、程序流程控制指令、处理器控制指令

2.2 重排序

        CPU为了最大性能利用率,只要能够保证程序最终结果和顺序化执行下结果相等,就可以更改指令执行顺序

指令的排序与代码的关系,比如:

int i = 8080;

这行代码需要执行两条指令:

        加载常量8080

        将8080赋值给变量i文章来源地址https://www.toymoban.com/news/detail-606236.html

到了这里,关于单例模式的线程安全形式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式3:单例模式:静态内部类模式是怎么保证单例且线程安全的?

    上篇文章:设计模式3:单例模式:静态内部类单例模式简单测试了静态内部类单例模式,确实只生成了一个实例。我们继续深入理解。 静态变量什么时候被初始化? 这行代码 private static Manager instance = new Manager(); 什么时候执行? 编译期间将.java文件转为.class文件,运行期间

    2024年02月12日
    浏览(45)
  • Linux之 线程池 | 单例模式的线程安全问题 | 其他锁

    目录 一、线程池 1、线程池 2、线程池代码 3、线程池的应用场景 二、单例模式的线程安全问题 1、线程池的单例模式 2、线程安全问题 三、其他锁 线程池是一种线程使用模式。线程池里面可以维护一些线程。 为什么要有线程池? 因为在我们使用线程去处理各种任务的时候,

    2024年04月18日
    浏览(41)
  • 【并发专题】单例模式的线程安全(进阶理解篇)

    最近学习了JVM之后,总感觉知识掌握不够深,所以想通过分析经典的【懒汉式单例】来加深一下理解。(主要是【静态内部类】实现单例的方式)。 如果小白想理解单例的话,也能看我这篇文章。我也通过了【前置知识】跟【普通懒汉式】、【双检锁懒汉】、【静态内部类】

    2024年02月14日
    浏览(40)
  • Java 枚举实现单例模式,线程安全又优雅!

    这种DCL写法的优点:不仅线程安全,而且延迟加载。 1.1 为什么要double check?去掉第二次check行不行? 当然不行,当2个线程同时执行getInstance方法时,都会执行第一个if判断,由于锁机制的存在,会有一个线程先进入同步语句,而另一个线程等待,当第一个线程执行了 new Sin

    2024年02月02日
    浏览(37)
  • 【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式

    🍎 个人博客: 个人主页 🏆 个人专栏: JAVA ⛳️   功不唐捐,玉汝于成 目录 前言 正文 懒汉式(Lazy Initialization): 双重检查锁定(Double-Checked Locking): 结语 我的其他博客 在软件设计中,单例设计模式是一种重要的设计思想,它确保了一个类只有一个实例,并提供了一

    2024年01月15日
    浏览(51)
  • 【Java中23种设计模式-单例模式2--懒汉式2线程安全】

    加油,新时代打工人! 简单粗暴,学习Java设计模式。 23种设计模式定义介绍 Java中23种设计模式-单例模式 Java中23种设计模式-单例模式2–懒汉式线程不安全 通过运行结果看,两个线程的地址值是相同的,说明内存空间里,创建了一个对象。

    2024年02月20日
    浏览(43)
  • 【Linux】线程池设计/单例模式/STL、智能指针与线程安全/读者写者问题

    线程池:一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可

    2024年02月03日
    浏览(44)
  • 【liunx】线程池+单例模式+STL,智能指针和线程安全+其他常见的各种锁+读者写者问题

    喜欢的点赞,收藏,关注一下把! 目前我们学了挂起等待锁、条件变量、信号量、生产者消费者模型那我们就根据这些写一个线程池! 线程池: 一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配

    2024年02月02日
    浏览(40)
  • 线程安全版本的单例设计模式 与 生产者消费者模型简介

    目录 单例设计模式 单例设计模式——饿汉式 单例设计模式——懒汉式 单例设计模式——懒汉式(优化步骤) 生产者消费者模型 介绍 优点 补充:关于阻塞队列 单例设计模式能够保证 某个类的实例在程序运行过程中始终都只会存在一份 。这一点在很多场景上都有需要,比

    2023年04月24日
    浏览(57)
  • 设计模式(单例模式,工厂模式),线程池

    目录 什么是设计模式? 单例模式 饿汉模式 懒汉模式 工厂模式 线程池 线程池种类 ThreadPoolExcutor的构造方法: 手动实现一个线程池  计算机行业程序员水平层次不齐,为了 让所有人都能够写出规范的代码, 于是就有了设计模式, 针对一些典型的场景,给出一些典型的解决方案 单例

    2024年02月11日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包