考虑从书中Java并发实践由Joshua布洛赫拍摄的片段 -保证首先执行的指令/声明会先执行吗?
public class NoVisibility{
private static boolean ready;
private static int number;
private static class ReaderThread extends Thread{
public void run(){
while(!ready)
Thread.yield();
System.out.println(number);
}
}
public static void main(String[] args){
new ReaderThread().start();
number = 42; // Statement 1
ready = true; // Statement 2
}
}
对于主要线程由JVM启动,是它保证声明1将要执行的在陈述2之前。
我完全理解ReaderThread可能无法看到上面两个静态变量的更新值。我没有要求解决方案。但是,如果语句1在语句2之前执行,ReaderThread仍然可以看到准备好的更新值 &不适用于号码?这是什么重新排序意味着一般?
在同一本书的页面底部的段落揭示了一个洞察到这 -
没有在一个线程操作将在由给定的顺序执行 保证程序,只要重新排序不是 即可在该线程内检测到,即使重新排序对其他线程显然为 。
有点混乱这里 -
作者是只要重新排序是不是从那个线程中检测到的说... ...而在同一时间,他says-
- 即使重新排序对其他线程显而易见(清晰可见)。
如果在的情况下,重新排序是其他线程清晰可见,为什么他在同一时间“只要重新排序,未检出从该线程内”说什么? 如果重新排序是可见的,那意味着它也是可检测的。不是吗?
*“是” *的语句在你的裁定,并为您的第二个问题执行:http://stackoverflow.com/a/16629365/351861 – specializt
你可以找到一个很好的例子[这里](HTTP: //jeremymanson.blogspot.de/2007/08/atomicity-visibility-and-ordering.html)。所以是的,这是可能的。 –
“在该线程内不可检测”表示*与当前代码*无法检测到。例如像'foo = 1; sleep_ten_minutes(); foo = 2;''''''''''''''''''''''''''''''可以从开始就设置foo = 2,因为它在执行线程中检测不到(不检查值),但其他线程在10分钟之前会看到foo == 2。 – alzee