Java 可变变量语义
我有几个关于不长的,双精度的可变变量的问题 1.当我们写入和读取时,是否存在竞争条件的可能性?例如,当我们读取一个易失性变量时,有人可以写入一个新值,而读取线程将不会获得更新的值 2.两个写入线程是否可以写入值,并且在最后,其中一个线程将与另一个线程的结果重叠?是否可以使用多个线程同时读取一个volatile,这意味着读取线程重叠,并且所有线程同时读取相同的结果 3.如果我们在一个volatile变量上启动5个读线程和5个写线程,读线程的结果是不可预测的Java 可变变量语义,java,volatile,Java,Volatile,我有几个关于不长的,双精度的可变变量的问题 1.当我们写入和读取时,是否存在竞争条件的可能性?例如,当我们读取一个易失性变量时,有人可以写入一个新值,而读取线程将不会获得更新的值 2.两个写入线程是否可以写入值,并且在最后,其中一个线程将与另一个线程的结果重叠?是否可以使用多个线程同时读取一个volatile,这意味着读取线程重叠,并且所有线程同时读取相同的结果 3.如果我们在一个volatile变量上启动5个读线程和5个写线程,读线程的结果是不可预测的 对。你不知道哪一个先发生,所以你的阅读线
long
和double
volatile int foo=0
和所有编写器都编写0
。然后保证所有的读者都能看到0
,否则这取决于日程安排和其他类似的事情你所有的问题看起来都像是希望
volatile
与顺序有关,但事实并非如此。它只是保证了可视性。如果您想要订单,您必须自己执行。另外,请阅读以下内容:听起来您好像在编写轮询代码。如果你需要对易变变量中的每一个变化采取行动,你需要比这更好的方法。谢谢你的精彩解释和关于问题1的最后一个问题。所以我们正在读取值,同时有人设置了一个新的值(比如10),我们将读取最后一个作者最后看到的值,当然,他不是刚刚设置了10的那个人?没有“相同的时间”。要么读取器在编写器写入值之前读取该值,要么编写器写入值后读取器读取该值。时机决定哪一个会发生。