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

做网站推广广告房地产行业网站开发

做网站推广广告,房地产行业网站开发,怎么做网络推广营销,工业园做网站的公司DCL DCL#xff08;Double-Checked Locking#xff09;是一种用于实现线程安全的延迟初始化的技术。在Java中#xff0c;DCL通常用于单例模式的实现。 DCL的基本思想是通过两次检查锁来实现延迟初始化。在第一次检查时#xff0c;如果对象已经被初始化了#xff0c;那么…DCL    DCLDouble-Checked Locking是一种用于实现线程安全的延迟初始化的技术。在Java中DCL通常用于单例模式的实现。 DCL的基本思想是通过两次检查锁来实现延迟初始化。在第一次检查时如果对象已经被初始化了那么直接返回对象。如果对象尚未被初始化则进入临界区并获取锁在临界区中再次检查对象是否被初始化以确保只有一个线程进行实例化操作。 单例模式 DCL- 重排序 在Java内存模型中重排序是指编译器和处理器为了提高并行度和性能可能会对指令的执行顺序进行重新排序。 在DCLDouble-Checked Locking单例模式中为了避免多个线程同时创建实例我们通常会使用双重检查锁定来实现线程安全的单例模式。 然而由于重排序的存在DCL单例模式可能会导致线程安全的问题。 在DCL单例模式中有以下几个步骤 检查实例是否已经创建如果已经创建则直接返回实例。如果实例未创建则使用同步锁来创建实例。创建实例后再次检查实例是否已经创建如果已经创建则直接返回实例。 在步骤2和步骤3之间可能会发生重排序。如果重排序发生可能会导致多个线程同时进入步骤3从而创建多个实例。 为了解决这个问题我们需要使用volatile关键字。在使用volatile关键字修饰实例的引用时会禁止指令重排序。 使用volatile关键字修饰实例引用后可以确保在多线程环境下实例的创建和赋值操作是按照顺序进行的从而避免了重排序导致的线程安全问题。 下面是一个使用volatile关键字修饰的DCL单例模式的示例代码 public class Singleton {private volatile static Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance null) {synchronized (Singleton.class) {if (instance null) {instance new Singleton();}}}return instance;} }在这个示例代码中我们使用了volatile关键字修饰了instance确保了步骤3的操作不会发生重排序。这样就避免了线程安全问题。 DCL- happens-beofre 在Java内存模型中happens-before原则是指如果一个操作执行的结果需要对另一个操作可见那么这两个操作之间必须存在happens-before关系。 在DCL双重检查锁单例模式中使用了volatile关键字来保证线程安全。volatile关键字具有禁止指令重排序的作用因此可以保证在DCL中的两次检查操作之间初始化操作的结果对其他线程可见。 具体来说在DCL中的happens-before关系如下 在线程A执行DCL的第一个检查操作时线程A读取到的volatile变量值会反映在该操作之前的所有操作中。在线程A执行DCL的第一个检查操作后如果发现单例对象没有被初始化线程A会进入同步代码块。在进入同步代码块之前线程A必须先获取锁。在线程A获取到锁之后执行的操作会反映在该操作之前的所有操作中包括第一个检查操作。在线程A执行初始化操作之前所有线程对该对象的引用都必须被刷新到主存中以便其他线程能够看到更新后的值。在线程A执行初始化操作时线程A对volatile变量的写入操作会反映在该操作之前的所有操作中。在线程A执行初始化操作之后线程A会释放锁此时所有对该锁的后续获取操作都必须在该操作之前执行。在线程B执行DCL的第一个检查操作时线程B读取到的volatile变量值会反映在该操作之前的所有操作中。在线程B执行DCL的第一个检查操作后如果发现单例对象已经被初始化线程B可以直接使用该对象无需再进入同步代码块。 通过以上happens-before关系DCL单例模式可以保证在多线程环境下只会有一个实例被创建并且对其他线程可见。 解决方案 volatile方案 使用volatile关键字修饰共享变量能够实现如下两个目标 禁止指令重排序在Java内存模型中编译器和处理器为了性能优化会对指令进行重排序。但是如果不使用volatile关键字修饰共享变量就有可能导致指令重排序从而破坏DCL的正确性。强制线程从主内存中读取变量volatile关键字会强制线程从主内存中读取共享变量的值而不是从工作内存中读取。这样可以确保线程读取到的是最新的变量值。 使用volatile关键字修饰共享变量的DCL实现如下所示 public class Singleton {private static volatile Singleton instance;private Singleton() {// private constructor}public static Singleton getInstance() {if (instance null) { // 第一次检查synchronized (Singleton.class) {if (instance null) { // 第二次检查instance new Singleton();}}}return instance;} }在上述代码中instance变量使用volatile关键字修饰确保线程对instance的读写操作在工作内存和主内存之间保持一致。同时通过双重检查锁定double-checked locking来确保只有第一次调用getInstance()方法时才会创建实例。 需要注意的是虽然volatile关键字能够解决DCL的一些问题但并不能完全保证线程安全。实际上DCL在Java 1.5之前的版本中是无法正确工作的主要是由于JVM在处理volatile关键字时的实现细节有问题。因此在Java 1.5之前的版本中建议使用其他线程安全的单例模式实现方式如静态内部类单例模式。 基于类初始化的解决方案 基于类初始化的解决方案也称为静态内部类解决方案是一种解决DCL问题的方法它利用了Java的类初始化过程的线程安全性。 具体实现如下 创建一个私有的静态内部类该静态内部类持有一个私有静态变量的实例。 public class Singleton {private Singleton() {// 私有化构造方法}private static class SingletonHolder {private static final Singleton INSTANCE new Singleton();}public static Singleton getInstance() {return SingletonHolder.INSTANCE;} }在静态内部类中实例化Singleton对象并将其赋值给静态变量INSTANCE。 客户端通过调用Singleton.getInstance()方法来获取Singleton的唯一实例。 这种基于类初始化的解决方案可以保证线程安全性因为在Java中类的静态初始化阶段会由类加载器来保证线程安全性。当SingletonHolder被加载和初始化时静态变量INSTANCE也会被创建并初始化类初始化阶段是单线程执行的因此可以保证 INSTANCE 的唯一性。 这种解决方案的缺点是在类加载时就实例化了Singleton对象如果该对象占用较多资源或需要延迟加载可能会影响应用程序的性能。 总结 DCLDouble-Checked Locking是一种延迟初始化实例的一种常用模式。其核心思想是在保证线程安全的前提下尽可能地减少同步开销提高程序性能。 在Java内存模型中使用DCL模式需要注意以下几点 使用volatile关键字修饰实例变量确保可见性在DCL模式中需要使用volatile关键字修饰实例变量以确保不同线程对该变量的可见性。通过使用volatile关键字可以保证所有线程在访问该变量时都能看到最新的值从而避免出现不一致的情况。 加锁保证多线程安全在DCL模式中需要使用synchronized关键字对实例的初始化方法进行加锁以保证多线程环境下的安全性。只有一个线程能够成功获取该锁其他线程则需要等待。 双重检查保证实例只被初始化一次在DCL模式中使用双重检查的方式保证实例只被初始化一次。首先通过检查实例是否已经被初始化避免重复初始化然后再通过加锁的方式进行实例的初始化。 使用局部变量提高性能在DCL模式中可以使用局部变量保存已经初始化的实例避免每次获取实例时都加锁。通过使用局部变量可以提高程序的性能。
http://www.pierceye.com/news/577050/

相关文章:

  • 济宁网站建设 企业谷wordpress手机 不适应
  • 如何用php做网站合肥专业手机网站哪家好
  • 如何推广自己的网站和产品如何用dw做网站地图
  • 株洲有名的网站重庆市公路建设信息网官网
  • 网站安全证书出错怎么做dw网页制作素材网站
  • 收录查询 站长工具给网站做解答是干嘛的
  • 成都哪些公司可以做网站建网站现软件
  • 深圳wap网站建设传奇霸主页游
  • 做网站首先要干什么营销软文200字
  • 帝国cms做的网站私人定制女装店
  • 网站建设南沙wordpress video
  • 网站建设开票应该开哪个行业什么网站可以免费做视频的软件
  • 百度seo查询收录查询网站推广策划案seo教程
  • 如何免费建立网站中贤建设集团网站
  • 如何做转运网站黄聪 wordpress
  • 临海市住房与城乡建设规划局网站宁波网络推广培训
  • go 网站开发自己在线制作logo
  • 重庆市网站建设公司企业服务账号
  • 网站建设的市场情况网站系统里不能打印
  • 网站如何适应屏幕做网站时无法上传图片
  • 网站的橱窗怎么做嘉兴住房和城乡建设厅网站
  • 吉林省城乡建设官方网站163企业邮箱登录入口官网
  • 做网站参考文献某企业网站建设方案2000字
  • 网站托管哪家好织梦购物网站整站源码
  • 怎么做网站的优化排名wordpress的目录结构(一)
  • 个人可以做公益网站吗美食杰网站的建设目的
  • 宿迁公司企业网站建设《网站基础建设-首保》
  • 做全屏式网站尺寸是多大国外虚拟主机 两个网站
  • 黑龙江建设网站招聘广西住房和城乡建设厅培训中心官方网站
  • 做网站客户最关心的是什么制作网页原型的目的