当前位置: 首页 > news >正文

开传奇怎么建设自己的网站wordpress生成的网页

开传奇怎么建设自己的网站,wordpress生成的网页,设计网站公司长沙,wordpress 报名文章目录 前言如何实现一个双重校验锁 DCL定义一个单例变量定义一个获取单例的方法性能优化性能优化带来的一点点问题什么是指令重排? 总结如何理解文章开篇理解的三个问题1、为什么需要使用两个 if 语句?2、为什么使用了 synchronized 关键字还需要使用…

文章目录

  • 前言
  • 如何实现一个双重校验锁 DCL
    • 定义一个单例变量
    • 定义一个获取单例的方法
    • 性能优化
    • 性能优化带来的一点点问题
      • 什么是指令重排?
  • 总结
    • 如何理解文章开篇理解的三个问题
      • 1、为什么需要使用两个 if 语句?
      • 2、为什么使用了 synchronized 关键字还需要使用 volatile 关键字?
      • 3、双重校验锁使用需要注意的问题
  • 个人简介

前言

  • hello,大家好,我是 Lorin,今天给大家带来双重校验锁的灵魂三问?以及我们如何一步步实现一个懒汉式单例。开始阅读前,大家可以思考下面三个问题:
DCL 实现中:
1、为什么需要使用两个 if 语句?
2、为什么使用了 synchronized 关键字还需要使用 volatile 关键字?
3、双重校验锁使用需要注意的问题

如何实现一个双重校验锁 DCL

  • 双重校验锁 DCL 最常用使用的场景在懒汉式单例,下面我们按照思路简单实现一个懒汉式单例:

定义一个单例变量

public class SingletonDemo {private static Object object = null;
}

定义一个获取单例的方法

  • 定义一个单例的获取方法,用于单例的初始化和获取,为了支持多线程访问,我们这里使用 synchronized 进行同步,保证同一时刻只有一个线程访问。
public class SingletonDemo {private static Object object = null;// 初始化和获取实例public Object getObject() {synchronized (SingletonDemo.class) {if (object == null) {object = new Object();}return object;}}
}

性能优化

  • 上面的懒汉式单例看起来并没有多大的问题,但是却存在很大的性能的问题,因为我们每次获取我们的实例都需要进行锁的获取和释放,即使我们的实例已经初始化完成,因此为了解决这个问题,我们需要进行一点点优化。
public class SingletonDemo {private volatile static Object object = null;public Object getObject() {// 如果实例已经初始化完成,直接返回实例不获取锁if (object != null){return object;}synchronized (SingletonDemo.class) {if (object == null) {object = new Object();}return object;}}
}

性能优化带来的一点点问题

  • 上面的代码表面上看起来已经完美了,解决了并发问题,也优化了性能问题,但是仔细看你会发现了新的问题,由于处理指令重排的优化可能导致 object != null 判断并不准确,怎么理解呢?
创建一个对象分为初始化和实例化两部分,大致可以分为以下几步:1、在堆中申请一份内存
2、创建对象
3、将 object 指向我们对象的内存引用如果没有指令重排的情况下,我们拿到的对象一定是完整的对象,但是可能存在指令重排优化,上面的顺序可能变成下面这样:1、申请一份内存
2、将 object 指向我们对象的内存引用
3、创建对象那么我们将会拿到一个没有实例化完成的对象,因此我们需要禁止指令重排,Java 提供了 volatile 指令来禁止指令重排。
  • 题外话:我们写代码的过程其实就是不断在重复优化和解决的问题,直到达到适应我们目前场景、基本情况的最优解(不一定是理论的最优解)。

什么是指令重排?

  • 为了提升执行速度/性能,计算机在执行程序代码的时候,会对指令进行重排序。什么是指令重排?简单来说就是系统在执行代码的时候并不一定是按照程序的代码的顺序依次执行。

  • 指令重排可以保证单线程串行语义一致(as-if-serial),但是没有义务保证多线程间的语义也一致,所以在多线程下,指令重排可能会导致一些问题。

  • 关于指令重排更多内容可以参考 一文读懂 Java Memory Model(JMM)

  • 最后,我们得到了终极版本的代码:

public class SingletonDemo {private volatile static Object object = null;public Object getObject() {// 如果实例已经初始化完成,直接返回实例不获取锁if (object != null){return object;}synchronized (SingletonDemo.class) {if (object == null) {object = new Object();}return object;}}
}

总结

如何理解文章开篇理解的三个问题

1、为什么需要使用两个 if 语句?

  • 为了性能优化

2、为什么使用了 synchronized 关键字还需要使用 volatile 关键字?

  • 性能优化导致带来了多线程指令重排问题,需要使用 volatile 解决指令重排的问题。

3、双重校验锁使用需要注意的问题

  • JDK版本大于1.5
  • Volatile 屏蔽指令重排序的语义在 JDK1.5 中才被完全修复,此前的 JDK 中即使将变量声明为 volatile 也仍然不能完全避免重排序所导致的问题
  • 关于 Volatile 相关介绍可以参考 Volatile 相关章节。

个人简介

👋 你好,我是 Lorin 洛林,一位 Java 后端技术开发者!座右铭:Technology has the power to make the world a better place.

🚀 我对技术的热情是我不断学习和分享的动力。我的博客是一个关于Java生态系统、后端开发和最新技术趋势的地方。

🧠 作为一个 Java 后端技术爱好者,我不仅热衷于探索语言的新特性和技术的深度,还热衷于分享我的见解和最佳实践。我相信知识的分享和社区合作可以帮助我们共同成长。

💡 在我的博客上,你将找到关于Java核心概念、JVM 底层技术、常用框架如Spring和Mybatis 、MySQL等数据库管理、RabbitMQ、Rocketmq等消息中间件、性能优化等内容的深入文章。我也将分享一些编程技巧和解决问题的方法,以帮助你更好地掌握Java编程。

🌐 我鼓励互动和建立社区,因此请留下你的问题、建议或主题请求,让我知道你感兴趣的内容。我期待与你一起在技术之路上前进,一起探讨技术世界的无限可能性。

📖 保持关注我的博客,让我们共同追求技术卓越。

http://www.yayakq.cn/news/746472/

相关文章:

  • 做网站的毕设用什么软件百度经验手机版
  • 霞浦建站公司什么叫网站app
  • 服务器怎么设置ip做网站中国建行网银登录
  • 阜新市建设学校官方网站成都百度公司怎么样
  • 《电子商务网站开发与管理》查询网站外链
  • 宁波大型网站建设网站开发工具的选择
  • 解析软件的网站淘宝标题优化工具推荐
  • 湘潭网站建设设计关于网站开发的论文
  • 爱站网关键词搜索工具莱芜论坛莱芜话题
  • 汕头多语种网站制作兰州论坛网站建设
  • 服务器512m内存做网站收费资源下载wordpress主题
  • 黄骅港港务集团阿里云wordpress优化
  • 中象做网站怎么样wordpress更改文件夹
  • 网站备案格式建立网站的元素有哪些
  • 做好对外门户网站建设河北城乡建设官方网站
  • 网站制作推广公司什么网站做问卷好
  • 德州做网站北京网站建设上石榴汇
  • 网站空间的地址虚拟主机建站教程
  • 广东专业网站定制赚钱软件哪个赚钱多又快
  • 扬州国土资源局网站开发区分局阿里云wordpress教程
  • 建同城购物网站经历中山企业网站制作公司
  • 阿里巴巴的网站应该怎么做湖南省建设厅网站
  • 网站建设与网页设计作业wordpress符号表情
  • 绵阳市建设工程信息网站网站如何带来流量
  • 北京大兴做网站公司十大手游平台app排行榜
  • 网站建设设计服务商建设工程教育网app
  • 建筑人才招聘网站平台汽车网站策划书
  • 马鞍山网站建设价格专业深圳网站定制开发
  • 杭州建平台网站公司建宇建设工程交易中心网站
  • 淄博 建设网站搬瓦工如何搭建做网站