这个问题可能看起来有点奇怪,但与可能的可见性问题有关。这个问题是受Java编程语言(>jdk5)中一个案例启发的,请考虑:
据我所知,将值字段标记为“readonly”并不能像Java中的“final”一样提供相同的保证(但我可能非常错误,希望如此)。因此,我们是否需要将字段标记为“volatile”(或使用内存屏障等)以确保对其他线程的可见性?或者是否应用其他规则以确保可见性?
public class InmutableValue {
private int value;
public InmutableValue(int value) {this.value = value;}
public int getValue() {return value;}
}
与常见观念相反,上面的类并不是线程安全的。在多线程环境中,“value”不能保证对其他线程可见。为了使其线程安全,我们需要强制执行一个“happens-before”规则,在字段中标记为“final”即可实现。
这种情况让我想知道 .Net 运行时是否也是如此。例如:
public class InmutableValue {
private int value;
public InmutableValue(int value) {this.value = value;}
public int Value { get{return value;}}
}
据我所知,将值字段标记为“readonly”并不能像Java中的“final”一样提供相同的保证(但我可能非常错误,希望如此)。因此,我们是否需要将字段标记为“volatile”(或使用内存屏障等)以确保对其他线程的可见性?或者是否应用其他规则以确保可见性?
value
不会被InmutableValue
类之外的代码所看到,因为它是private
的。不过,这似乎不是您使用的“visible”的定义。 - Gabe