广告
返回顶部
首页 > 资讯 > 精选 >Java怎么实现双重校验锁单例
  • 216
分享到

Java怎么实现双重校验锁单例

2023-06-28 19:06:33 216人浏览 八月长安
摘要

这篇文章主要介绍了Java怎么实现双重校验锁单例的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java怎么实现双重校验锁单例文章都会有所收获,下面我们一起来看看吧。代码实现Java代码实现如下://双重校验锁单

这篇文章主要介绍了Java怎么实现双重校验单例的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java怎么实现双重校验锁单例文章都会有所收获,下面我们一起来看看吧。

    代码实现

    Java代码实现如下:

    //双重校验锁单例public class SingleInstance {    //必须volatile修饰 见分析1    private volatile static SingleInstance instance;    //私有化构造函数    private SingleInstance() {    }     public static SingleInstance getInstance() {        //第一个判空 见分析2        if (instance == null) {            synchronized (SingleInstance.class) {                //第二个判空 见分析3                if (instance == null) {                    //新建实例                    instance = new SingleInstance();                }            }        }        return instance;    }}

    首先这里synchronized关键字没有修饰整个getInstance函数,因为这个函数可能使用地方很多,这样就会造成其他线程阻塞,不太好,所以这里只同步了一段代码。

    分析2:为什么在进入同步代码块时需要进行进行判空,假如有线程A和线程B,这时线程A先判断instance为null,所以它进入了同步代码块,创建了对象,然后线程B再进来时,它就不必再进入同步代码快了,可以直接返回,也其实也就是懒加载,可以加快执行速度。

    分析3:为什么在同步代码块中还要再进行一次判断呢,假如有线程A和线程B,它俩A先调用方法,B紧接着调用,这时A、B在分析2出的判空都是空,所以A进入同步代码块,B进行等待,当A进入同步代码块中创建了对象后,A线程释放了锁,这时B再进入,如果这时不加分析3的判空,B又会创建一个实例,这明显不符合规矩。

    分析1:那既然加了2层判断,那为什么还要加个volatile关键字呢,这里知识点就有点多了。

    因为新建实例的代码:

    instance = new SingleInstance();

    它不是一个原子操作,这个简单的赋值可以分为3步:

    给SingleInstance分配内存

    调用SingleInstance的构造方法

    把instance指向分配的内存空间

    这是正常逻辑的3个步骤,也只有按1 2 3执行后,这个instance才不是null。

    但是Java内存模型允许这个进行指令重排序,也就是这3步可能是123也可能是132,所以这里就有问题了。

    假如线程A和线程B,线程A已经跑到分析3处的代码,这时这条指令执行是132,刚把步骤3执行完,这时线程B跑到了分析1处的代码,会发现instance不为null了,这时线程B就直接返回了,从而导致错误。

    既然知道了原因,那volatile关键字就是解决这个的,它可以禁止指令重新排序,而且保证所有线程看到这个变量是一致的,也就是不会从缓存中读取(这个特性后面有机会再说),所以在创建instance实例时,它的步骤都是123,就不会出错了。

    关于“Java怎么实现双重校验锁单例”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Java怎么实现双重校验锁单例”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

    --结束END--

    本文标题: Java怎么实现双重校验锁单例

    本文链接: https://www.lsjlt.com/news/321039.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • Java怎么实现双重校验锁单例
      这篇文章主要介绍了Java怎么实现双重校验锁单例的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java怎么实现双重校验锁单例文章都会有所收获,下面我们一起来看看吧。代码实现Java代码实现如下://双重校验锁单...
      99+
      2023-06-28
    • Java双重校验锁单例原理
      目录前言正文代码实现总结前言 作为开发者,单例这个就再也熟悉不过了,但是作为多种单例实现模式,我个人觉得双重校验锁是非常不多的实现,我们简单来分析一下其原理。 正文 先来说一下Jav...
      99+
      2022-11-13
    • go单例怎么实现双重检测是否安全
      这篇文章主要讲解了“go单例怎么实现双重检测是否安全”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“go单例怎么实现双重检测是否安全”吧!现状当前有的项目直接使用Mutex锁,有的就直接判断n...
      99+
      2023-06-29
    • java签名校验功能怎么实现
      要实现Java签名校验功能,你可以按照以下步骤进行: 获取签名证书:首先,你需要获取要校验的文件的签名证书。可以使用Java的Ke...
      99+
      2023-10-26
      java
    • Vue Element-ui表单校验规则怎么实现
      今天小编给大家分享一下Vue Element-ui表单校验规则怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,...
      99+
      2022-10-19
    • Java中怎么实现接口数据校验
      今天就跟大家聊聊有关Java中怎么实现接口数据校验,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Controller接口层数据绑定校验实际上在Java开发中目前普通使用的Bean数据...
      99+
      2023-06-15
    • 使用ajax怎么实现在提交时校验表单
      这篇文章给大家介绍使用ajax怎么实现在提交时校验表单,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。什么是ajaxajax是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术,可以通过在后台与服务器进行少量数据...
      99+
      2023-06-08
    • 怎么实现java开发SpringBoot参数校验过程
      这篇文章主要讲解了“怎么实现java开发SpringBoot参数校验过程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么实现java开发SpringBoot参数校验过程”吧!为什么需要参数...
      99+
      2023-06-25
    • js前端表单数据处理和校验怎么实现
      这篇文章主要介绍了js前端表单数据处理和校验怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇js前端表单数据处理和校验怎么实现文章都会有所收获,下面我们一起来看看吧。1.数据处理当表单在视图所展示的数据并...
      99+
      2023-07-02
    • 怎么实现Java可重入分布式锁
      本篇内容主要讲解“怎么实现Java可重入分布式锁”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么实现Java可重入分布式锁”吧!可重入说到可重入锁,首先我们来看看一段来自 wiki 上可重入的...
      99+
      2023-06-16
    • java枚举怎么实现单例
      这篇文章主要介绍了java枚举怎么实现单例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、说明在功能上类似于 public 字段,它除了更简洁外,还自带序列化机制,并且即使...
      99+
      2023-06-15
    • java单例模式怎么实现
      Java中单例模式的实现方法有以下几种:1. 懒汉式(线程不安全):```public class Singleton {priva...
      99+
      2023-08-23
      java
    • Java双重MD5加密怎么实现安全登录
      本篇内容主要讲解“Java双重MD5加密怎么实现安全登录”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java双重MD5加密怎么实现安全登录”吧!一:问题引入对存储在数据库中的密码进行解密操作:...
      99+
      2023-07-02
    • java中怎么实现可重入的自旋锁
      这篇文章主要介绍了java中怎么实现可重入的自旋锁的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java中怎么实现可重入的自旋锁文章都会有所收获,下面我们一起来看看吧。说明是指试图获得锁的线程不会堵塞,而是通过...
      99+
      2023-06-30
    • java的单例模式怎么实现
      今天小编给大家分享一下java的单例模式怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下...
      99+
      2022-10-19
    • java怎么实现一个单例模式
      在Java中,可以通过以下两种方式来实现单例模式:1. 懒汉式单例模式(Lazy Initialization):```javapu...
      99+
      2023-09-27
      java
    • 怎么在java中实现内置锁的可重入性
      这篇文章给大家介绍怎么在java中实现内置锁的可重入性,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。java基本数据类型有哪些Java的基本数据类型分为:1、整数类型,用来表示整数的数据类型。2、浮点类型,用来表示小数...
      99+
      2023-06-14
    • java单例模式实现代码怎么写
      在Java中实现单例模式有多种方式,以下是其中几种常用的实现方式: 饿汉式(线程安全): public class Single...
      99+
      2023-10-24
      java
    • 怎么在java中实现一个可重入的自旋锁
      怎么在java中实现一个可重入的自旋锁?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3. ...
      99+
      2023-06-14
    • 怎么在java中使用枚举实现单例
      怎么在java中使用枚举实现单例?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2. ...
      99+
      2023-06-14
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作