gpt4 book ai didi

java - 具有非最终字段的不可变对象(immutable对象)如何成为线程不安全的?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:29:09 24 4
gpt4 key购买 nike

假设我们有这个

// This is trivially immutable.
public class Foo {
private String bar;
public Foo(String bar) {
this.bar = bar;
}
public String getBar() {
return bar;
}
}

是什么让这个线程不安全?继此 question .

最佳答案

Foo 在安全发布后是线程安全的。例如,这个程序可以打印“不安全”(它可能不会使用热点/x86 的组合)——如果你将 bar 设置为 final,它就不会发生:

public class UnsafePublication {

static Foo foo;

public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
while (foo == null) {}
if (!"abc".equals(foo.getBar())) System.out.println("unsafe");
}
}).start();

new Thread(new Runnable() {
@Override
public void run() {
foo = new Foo("abc");
}
}).start();
}
}

关于java - 具有非最终字段的不可变对象(immutable对象)如何成为线程不安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16062274/

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