我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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怎么实现双重校验锁单例”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

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

    下载Word文档

    猜你喜欢

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

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

    go单例怎么实现双重检测是否安全

    这篇文章主要讲解了“go单例怎么实现双重检测是否安全”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“go单例怎么实现双重检测是否安全”吧!现状当前有的项目直接使用Mutex锁,有的就直接判断n
    2023-06-29

    java签名校验功能怎么实现

    要实现Java签名校验功能,你可以按照以下步骤进行:获取签名证书:首先,你需要获取要校验的文件的签名证书。可以使用Java的KeyStore类来加载证书文件,并从中获取签名证书。KeyStore keyStore = KeyStore.ge
    2023-10-26

    Java中怎么实现接口数据校验

    今天就跟大家聊聊有关Java中怎么实现接口数据校验,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Controller接口层数据绑定校验实际上在Java开发中目前普通使用的Bean数据
    2023-06-15

    使用ajax怎么实现在提交时校验表单

    这篇文章给大家介绍使用ajax怎么实现在提交时校验表单,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。什么是ajaxajax是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术,可以通过在后台与服务器进行少量数据
    2023-06-08

    怎么实现java开发SpringBoot参数校验过程

    这篇文章主要讲解了“怎么实现java开发SpringBoot参数校验过程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么实现java开发SpringBoot参数校验过程”吧!为什么需要参数
    2023-06-25

    js前端表单数据处理和校验怎么实现

    这篇文章主要介绍了js前端表单数据处理和校验怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇js前端表单数据处理和校验怎么实现文章都会有所收获,下面我们一起来看看吧。1.数据处理当表单在视图所展示的数据并
    2023-07-02

    怎么实现Java可重入分布式锁

    本篇内容主要讲解“怎么实现Java可重入分布式锁”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么实现Java可重入分布式锁”吧!可重入说到可重入锁,首先我们来看看一段来自 wiki 上可重入的
    2023-06-16

    java枚举怎么实现单例

    这篇文章主要介绍了java枚举怎么实现单例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、说明在功能上类似于 public 字段,它除了更简洁外,还自带序列化机制,并且即使
    2023-06-15

    java单例模式怎么实现

    Java中单例模式的实现方法有以下几种:1. 懒汉式(线程不安全):```public class Singleton {private static Singleton instance;private Singleton() {}pub
    2023-08-23

    Java双重MD5加密怎么实现安全登录

    本篇内容主要讲解“Java双重MD5加密怎么实现安全登录”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java双重MD5加密怎么实现安全登录”吧!一:问题引入对存储在数据库中的密码进行解密操作:
    2023-07-02

    java中怎么实现可重入的自旋锁

    这篇文章主要介绍了java中怎么实现可重入的自旋锁的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java中怎么实现可重入的自旋锁文章都会有所收获,下面我们一起来看看吧。说明1、是指试图获得锁的线程不会堵塞,而是
    2023-06-30

    java怎么实现一个单例模式

    在Java中,可以通过以下两种方式来实现单例模式:1. 懒汉式单例模式(Lazy Initialization):```javapublic class Singleton {private static Singleton instanc
    2023-09-27

    怎么在java中实现内置锁的可重入性

    这篇文章给大家介绍怎么在java中实现内置锁的可重入性,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。java基本数据类型有哪些Java的基本数据类型分为:1、整数类型,用来表示整数的数据类型。2、浮点类型,用来表示小数
    2023-06-14

    java单例模式实现代码怎么写

    在Java中实现单例模式有多种方式,以下是其中几种常用的实现方式:饿汉式(线程安全):public class Singleton {private static Singleton instance = new Singleton();p
    2023-10-24

    怎么在java中实现一个可重入的自旋锁

    怎么在java中实现一个可重入的自旋锁?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3.
    2023-06-14

    怎么在java中使用枚举实现单例

    怎么在java中使用枚举实现单例?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2.
    2023-06-14

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录