Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JCIP安全点-它真的是线程安全的吗?_Java_Multithreading - Fatal编程技术网

Java JCIP安全点-它真的是线程安全的吗?

Java JCIP安全点-它真的是线程安全的吗?,java,multithreading,Java,Multithreading,Brian Goetz等人在Java并发实践中给出了以下示例(清单4.11) } 它真的是线程安全的吗?x和y既不是易失性的,也不是最终的,它们在设置时没有锁定,这意味着调用get()的另一个线程可能会看到过时的值(零)。我错过什么了吗 它真的是线程安全的吗 对 x和y既不是易变的也不是最终的 没错,但是 并且它们在没有锁定的情况下被设置 不对。get和set方法是synchronized方法,这意味着它们隐式地锁定并同步此 实际上。。。对此有一个警告。在创建SafePoint实例和(第一个)

Brian Goetz等人在Java并发实践中给出了以下示例(清单4.11)

}

它真的是线程安全的吗?x和y既不是易失性的,也不是最终的,它们在设置时没有锁定,这意味着调用get()的另一个线程可能会看到过时的值(零)。我错过什么了吗

它真的是线程安全的吗

x和y既不是易变的也不是最终的

没错,但是

并且它们在没有锁定的情况下被设置

不对。get和set方法是
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;
}