首页 > 编程语言 >在《java并发编程实战》这本书的第十六章中讲到不安全的发布时,给了一个不安全的延迟初始化

在《java并发编程实战》这本书的第十六章中讲到不安全的发布时,给了一个不安全的延迟初始化

时间:2022-11-27 12:34:37浏览次数:49  
标签:初始化 resource Resource class 安全 实例 static java public

示例:

public class UnsafeLazyInitialization {
    private static Resource resource;

    public static Resource getInstance() {
        if (resource == null)
            resource = new Resource(); // unsafe publication
        return resource;
    }

    static class Resource {
    }
}

一般情况下,估计大家都会这么写代码,在非并发环境中,这个getInstance方法会工作的很好,但是放到并发环境中,问题就来了,比如竞态条件,但这里还存在另外一个问题,即另一个线程可能会看到对部分构造的Resource实例的引用。

简单点来说,就是线程A在访问getInstance方法时,发现resource为null,于是就resource设置为一个新实例,在这个过程中,线程B也调用getInstance方法,发现resource不为空,因此就直接使用这个resource实例了。看起来貌似没有问题,但是因为线程A实例化resource的操作和线程B读取resource实例的操作之间不存在Happens-Before关系,所以,在线程B使用resource实例时,resource实例也许还未构造完成,这就导致了线程B看到的resource实例不正确的状态。

解决这个问题的一个简单办法就是使用同步,这也是我们经常会使用的办法:

public class SafeLazyInitialization {
    private static Resource resource;

    public synchronized static Resource getInstance() {
        if (resource == null)
            resource = new Resource();
        return resource;
    }

    static class Resource {
    }
}

下面再来看看另一种解决办法,书中称之为延迟初始化占位类模式,我认为这个方法很巧妙:

public class ResourceFactory {
    private static class ResourceHolder {
        public static Resource resource = new Resource();
    }

    public static Resource getResource() {
        return ResourceFactory.ResourceHolder.resource;
    }

    static class Resource {
    }
}

 

标签:初始化,resource,Resource,class,安全,实例,static,java,public
From: https://www.cnblogs.com/easy77/p/16929433.html

相关文章

  • Javascript(笔记54) - promise - 4 async函数、await表达式、结合示例
    本套笔记,是基于尚硅谷的课程整理;​​Javascript(笔记51)-promise-1介绍与基本使用 ​​​​Javascript(笔记52)-promise-2API和方法​​​​Javascript(笔记53)......
  • java-fianl关键字
    前言该篇文章讲了关于javafinal关键字的一些内容,大部分内容参考:https://www.cnblogs.com/dolphin0520/p/3736238.html概述final可以修饰:变量类方法fin......
  • JAVA强软弱虚4种引用的区别
    JAVA强软弱虚4种引用的区别Java提供了四种级别的应用类型:强引用、软引用、弱引用及虚引用。那么这四种引用类型有什么区别呢?首先我们通过一张图来看看四种引用在Java......
  • Java中Collections.sort()方法详解
     时间:2022/11/27 在我们写算法题的时候有时需要对给定的List列表进行排序,这样方便之后的操作,此时我们可以用到Collections类中的sort方法,JavaAPI文档中对该方......
  • 【java技术总结】stream来处理分组问题
    1.使用Collectors.groupingBy(方法引用返回分组属性作为k)2.使用Collectors.groupingBy(方法引用返回分组属性作为k,Collectors的静态类返回值)3.使用reduce归并数据,reduc......
  • Java:Spring Boot整合mybatis-plus示例
    文档​​https://start.spring.io/​​mybatis-plus​​文档​​​|​​github​​maven​​文档​​p6spy​​文档​​​|​​github​​使用示例目录​​使用示......
  • JavaScript中String的match方法详解
     String.prototype.match()**String.prototype.match()方法返回通过一个正则表达式匹配到的字符串结果。**​​var='Thequickbrownfoxjumpsoverthelazydog.Itba......
  • Java程序运行机制、注释及标识符 关键字
    Java程序运行机制1.编写编写是指在Java开发环境中进行程序代码的编辑,最终生成后缀名为“.java”的Java源文件。2.编译编译是指使用Java编译器对源文件进行错误排查的过......
  • 面向对象的JavaScript框架 MooTools
    MooTools是一个简洁,模块化,面向对象的JavaScript框架。它能够帮助你更快,更简单地编写可扩展和兼容性强的JavaScript代码。Mootools从Prototype.js中汲取了许多有益的设计理......
  • Java: ArrayList
    The ArrayList classisaresizable array,whichcanbefoundinthe java.util package.Thedifferencebetweenabuilt-inarrayandan ArrayList inJava,......