当前位置: 首页 > 知识库问答 >
问题:

是什么使不可变对象在没有安全发布技术的情况下被发布?

钱志义
2023-03-14
               V/S 

共有1个答案

戎高爽
2023-03-14

并不是每个用例都需要在任何精确的时刻看到一个新实例。考虑一下教科书上的例子:懒散初始化的单例,在每个线程中重新初始化比安全共享更便宜。在这种情况下,您可能会不安全地共享一个不可变的实例,而每个无法接收已存在副本的线程只会创建自己的副本。

至于术语:不安全发布意味着它发生在数据竞赛之下。安全出版则相反。

BTWjava.lang.String是一个有效地不可变对象的示例,但它可以不安全地共享。

 类似资料:
  • 及其不安全的发布: 可以抛出AssertionError,我同意。作者写道,这是因为不安全的出版,但另一方面没有答案:什么才是正确的出版方式?它们表示了4个安全发布习惯用语,但我不明白,为什么它们会在上面的情况下起作用: 要安全地发布对象,必须同时使对对象的引用和对象的状态对其他线程可见。通过以下方法可以安全地发布构造正确的对象: null 这里是我的第一个问题,谢谢你的帮助!

  • 问题内容: 阅读“实践中的Java并发性”,第3.5节包含以下内容: 除了创建两个的明显的线程安全隐患外,该书还声称可能会发生发布问题。 此外,对于诸如 一个可以扔! 这怎么可能?我能想到的唯一允许这种荒谬行为的方法是,如果构造函数不被阻塞,那么当构造函数代码仍在另一个线程中运行时,将创建对实例的引用。 这可能吗? 问题答案: 之所以可行,是因为Java的内存模型较弱。它不保证读写顺序。 可以通过

  • 从静态初始值设定项初始化对象引用 将对它的引用存储到volatile字段或atomicreference 将对它的引用存储到正确构造的对象的最后一个字段 将对它的引用存储到由锁正确保护的字段中。 但是,我对第二个成语感到困惑。因为只能保证引用对另一个线程是可见的,但它没有它所引用的对象构造的同步。那么它如何保证可变对象是正确构造的,构造这个对象的线程是什么,被另一个线程打断了呢?

  • 我正在为窗体控件创建可访问的帮助文本。我计划使用将可访问的描述附加到字段。这里讨论这种方法 虽然在使用ChromeVox扩展和Windows10屏幕阅读器的测试中,我发现没有公布,但它在浏览器和屏幕阅读器中得到了很好的支持,所以我计划使用这种方法。 此外,这表明在某些情况下会被忽略,或者不会像预期的那样工作,但这些情况非常具体,我通常可以接受。 aria-descripedby内容可能并不总是向用

  • 问题内容: 我正在重读Java Concurrency in Practice,但不确定我是否完全了解有关不变性和安全发布的章节。 这本书说的是: 不可变对象可以由任何线程安全地使用,而无需额外的同步,即使不使用同步来发布它们也是如此。 我不明白的是,为什么有人(有 兴趣使自己的代码正确无误 )发布不安全的参考资料? 如果对象是不可变的,并且不安全地发布,那么我知道获得该对象引用的任何其他线程都将

  • 问题内容: 我有一个从网站的jnlp文件启动的Java应用程序。我正在尝试使其运行,而不会在运行前弹出一堆安全警告。 该程序分为大约10个不同的jar文件,大约30个jar库,以及也包含在jar文件中的几个本机库。 我已经使用官方代码签名证书(来自Verisign)对所有jar文件进行了签名,并将jnlp文件包含在保存主类的jar文件中,并向我所使用的主要10个jar添加了权限和代码库属性编译。