Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.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 可变变量语义_Java_Volatile - Fatal编程技术网

Java 可变变量语义

Java 可变变量语义,java,volatile,Java,Volatile,我有几个关于不长的,双精度的可变变量的问题 1.当我们写入和读取时,是否存在竞争条件的可能性?例如,当我们读取一个易失性变量时,有人可以写入一个新值,而读取线程将不会获得更新的值 2.两个写入线程是否可以写入值,并且在最后,其中一个线程将与另一个线程的结果重叠?是否可以使用多个线程同时读取一个volatile,这意味着读取线程重叠,并且所有线程同时读取相同的结果 3.如果我们在一个volatile变量上启动5个读线程和5个写线程,读线程的结果是不可预测的 对。你不知道哪一个先发生,所以你的阅读线

我有几个关于不长的,双精度的可变变量的问题

1.当我们写入和读取时,是否存在竞争条件的可能性?例如,当我们读取一个易失性变量时,有人可以写入一个新值,而读取线程将不会获得更新的值

2.两个写入线程是否可以写入值,并且在最后,其中一个线程将与另一个线程的结果重叠?是否可以使用多个线程同时读取一个volatile,这意味着读取线程重叠,并且所有线程同时读取相同的结果

3.如果我们在一个volatile变量上启动5个读线程和5个写线程,读线程的结果是不可预测的

  • 对。你不知道哪一个先发生,所以你的阅读线程会看到两个值中的一个

  • 当然,如果你是说覆盖。如果您有2次写入,则最后一次写入将获胜。如果您的意思是重叠,如结果值变成两次写入的组合,则不是。即使是
    long
    double

  • 当然。除非您有例如
    volatile int foo=0
    和所有编写器都编写
    0
    。然后保证所有的读者都能看到
    0
    ,否则这取决于日程安排和其他类似的事情


  • 你所有的问题看起来都像是希望
    volatile
    与顺序有关,但事实并非如此。它只是保证了可视性。如果您想要订单,您必须自己执行。

    另外,请阅读以下内容:听起来您好像在编写轮询代码。如果你需要对易变变量中的每一个变化采取行动,你需要比这更好的方法。谢谢你的精彩解释和关于问题1的最后一个问题。所以我们正在读取值,同时有人设置了一个新的值(比如10),我们将读取最后一个作者最后看到的值,当然,他不是刚刚设置了10的那个人?没有“相同的时间”。要么读取器在编写器写入值之前读取该值,要么编写器写入值后读取器读取该值。时机决定哪一个会发生。