gpt4 book ai didi

java - 类线程在实例初始化时是否安全

转载 作者:行者123 更新时间:2023-11-30 01:57:43 28 4
gpt4 key购买 nike

我一直在尝试掌握多线程的概念,并对以下代码感到困惑:

class MyClass{ 

private StringBuilder content = new StringBuilder();

public void setContent(){
content.append("Some String");
content.append("more String");
}

public String getContent(){
return content.toString();
}
}

我的理解是,MyClass 不能仅通过同步其 setter 和 getter 方法来实现线程安全。因为在创建 MyClass 对象时,内容引用可能会有不正确的对象初始化。为了进行正确的初始化,内容应该是最终的。谁能帮我澄清一下吗?

最佳答案

My understanding is that MyClass cannot be made thread safe just by synchronizing its setter and getter methods.

这是不正确的。

如果对 MyClass 实例的引用安全地发布到使用它的所有线程,那么同步 getter 和 setter 将看到正确的对象初始状态。

如果您声明content(以及任何其他字段)为final,您可以免除安全发布的要求。但是,由于这不是一个不可变的类,因此 getter 和 setter 仍然需要同步。

<小时/>

final 字段的特殊语义(如 JLS 17.5 中所述)允许真正不可变的对象成为线程安全的,而无需任何同步开销。但这些语义并不直接适用于您的示例,因为“setter”正在改变对象。

<小时/>

顺便说一句,如果content的类型是StringBuffer而不是StringBuilder并且变量是final。如果没有synchronized,结果将“大部分”是线程安全的。这是因为 StringBuilder 对于这些操作来说是线程安全的。唯一的问题是你的“setter”调用了两次append。如果没有synchronized,getter 就有可能看到缓冲区的中间状态。

关于java - 类线程在实例初始化时是否安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53829557/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com