当前位置: 首页 > 面试题库 >

这是对象的安全出版物吗?

谷梁波
2023-03-14
问题内容

我有一堂课

class Item {
  public int count;
  public Item(int count) {
    this.count = count;
  }
}

然后,我将在其他类的字段中引用Item

class Holder {
  public Item item;
  public Holder() {
    item = new Item(50);
  }
}

可以安全发布此 新Item 对象吗?如果没有,为什么?根据Java Concurrency in Practice,在 未完全构建
新项目的情况下发布了新项目,但在我看来,新项目已被完全构建:它的this引用不会转义,并且对它及其状态的引用是同时发布的,因此使用者线程将看不到过时的值。还是可见性问题。我不知道原因。


问题答案:

可以安全发布此新Item对象吗?如果没有,为什么?

问题围绕指令的优化和重新排序。当您有两个线程正在使用 同步的构造对象时,出于效率考虑,编译器可能会决定对指令重新排序,并为对象分配内存空间,
然后 在构造函数和构造函数完成 之前 将其引用存储在item字段中。字段初始化。或者,它可以重新排序内存同步,以便其他线程以这种方式 感知
它。

如果将item字段标记为,final则保证构造函数作为构造函数的一部分完成该字段的初始化。否则,在使用锁之前,您将必须同步锁。这是Java语言定义的一部分。

这是另外两个参考:

  • 双重检查锁定已损坏
  • 同步和Java内存模型


 类似资料:
  • 本文向大家介绍meteor 全球出版物,包括了meteor 全球出版物的使用技巧和注意事项,需要的朋友参考一下 示例 全局发布不具有名称,并且不需要从连接的客户端进行订阅,因此,一旦客户端连接到服务器,该连接就可供连接的客户端使用。 为了实现这一目标,一个简单的名称的发表为null像这样            

  • 问题内容: Spring对象是线程安全的吗?如果没有,如何使它们线程安全? 问题答案: 这是两个不相关的问题: spring线程安全吗? 没有。 Spring具有不同的bean 作用域(例如Prototype,Singleton等),但是所有这些作用域都是在创建bean 时强制执行的。例如,每次“注入”一个“原型”范围的bean都会被创建,而一个“单个”范围的bean将被创建一次并在应用程序上下文

  • 我读过很多关于Servlet和threadsafe的文章--我知道,“Servlet容器只加载和实例化每个Servlet一次……”。但是,如果我创建抽象类extends Servlet,它有一个用参数处理的方法,那么在后代中使用这个threadsafe吗?

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

  • Perl 语言编程,第四版 称为大骆驼书,真正的 Perl 圣经。 Perl 语言入门,第六版 称为小骆驼书,Perl 标准教程。 Perl Cookbook,第二版 一本如何利用 Perl 干活的问题导向书籍。 Object Oriented Perl 关于 Perl 5 面向对象编程的最佳解释。 Perl 最佳实践 展示如何写优良、可维护的 Perl 代码。 The Perl Review 在

  • 问题内容: 我正在编写一个需要处理内存中私钥的快速应用程序。由于此类对象的敏感性,因此在释放对象时需要清除键(也就是将其写为全零),并且无法将内存分页到磁盘(通常使用mlock()完成)。 在Objective-C中,您可以提供一个自定义CFAllocator对象,该对象允许您使用自己的函数来分配/取消分配/重新分配对象使用的内存。 因此,一种解决方案是仅在Objective-C中实现一个“ Se