【发布时间】:2013-09-04 15:55:00
【问题描述】:
Java并发实战书给出了不安全发布的例子
public class Holder
{
private int n;
public Holder(int n)
{
this.n = n;
}
public void assertSanity()
{
if (n != n)
throw new AssertionError("This statement is false.");
}
}
上面的代码似乎是线程安全的。如果 n 是公共变量,它将不是线程安全的。书的例子错了吗?
【问题讨论】:
-
只要 n 是私有的,任何东西都不能修改,所以你当前的代码确实是线程安全的。
-
不考虑反射。
-
基本上,这曾经是一个严重的潜在问题,但 Java 5 规范使内存模型更加严格,不再是问题。 (
n应该仍然是final。) -
@zhong.j.yu 人们一直这么说。我想看一个例子。我还没有看到一个。他们都假设你已经有一个参考,但没有说明你是怎么得到它的。
-
@Cruncher VM 可以分配一个空白对象,将其地址分配给一个共享变量(其他线程可以提前观察到),然后调用构造函数。
标签: java multithreading concurrency