Java JCIP安全点-它真的是线程安全的吗?
Brian Goetz等人在Java并发实践中给出了以下示例(清单4.11) } 它真的是线程安全的吗?x和y既不是易失性的,也不是最终的,它们在设置时没有锁定,这意味着调用get()的另一个线程可能会看到过时的值(零)。我错过什么了吗 它真的是线程安全的吗 对 x和y既不是易变的也不是最终的 没错,但是 并且它们在没有锁定的情况下被设置 不对。get和set方法是Java JCIP安全点-它真的是线程安全的吗?,java,multithreading,Java,Multithreading,Brian Goetz等人在Java并发实践中给出了以下示例(清单4.11) } 它真的是线程安全的吗?x和y既不是易失性的,也不是最终的,它们在设置时没有锁定,这意味着调用get()的另一个线程可能会看到过时的值(零)。我错过什么了吗 它真的是线程安全的吗 对 x和y既不是易变的也不是最终的 没错,但是 并且它们在没有锁定的情况下被设置 不对。get和set方法是synchronized方法,这意味着它们隐式地锁定并同步此 实际上。。。对此有一个警告。在创建SafePoint实例和(第一个)
synchronized
方法,这意味着它们隐式地锁定并同步此
实际上。。。对此有一个警告。在创建
SafePoint
实例和(第一个)get
或set
调用其他线程之间,还必须有一个before。如果没有,则get
或set
可能会看到x
和y
的默认值,而不是传递给构造函数的值
Goetz等人在Java并发实践的下一页中介绍了这一点。。。尽管他们使用比hb关系更高层次的推理。在清单4.12中,他们使用ConcurrentHashMap
来确保SafePoint
安全发布
它真的是线程安全的吗
对
x和y既不是易变的也不是最终的
没错,但是
并且它们在没有锁定的情况下被设置
不对。get和set方法是synchronized
方法,这意味着它们隐式地锁定并同步此
实际上。。。对此有一个警告。在创建
SafePoint
实例和(第一个)get
或set
调用其他线程之间,还必须有一个before。如果没有,则get
或set
可能会看到x
和y
的默认值,而不是传递给构造函数的值
Goetz等人在Java并发实践的下一页中介绍了这一点。。。尽管他们使用比hb关系更高层次的推理。在清单4.12中,他们使用ConcurrentHashMap
来确保SafePoint
安全发布
public class SafePoint {
private int x, y;
public SafePoint(int x, int y) {
this.x = x;
this.y = y;
}
public synchronized int[] get() {
return new int[] { x, y };
}
public synchronized void set(int x, int y) {
this.x = x;
this.y = y;
}