例子:
import java.util.Random;
public class MemoryTest {
int x, y,read_x,read_y;
public void randomSleep(){
try {
Thread.sleep(new Random().nextInt(30));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Thread CreateThread1(){
return new Thread(new Runnable() {
@Override
public void run() {
randomSleep();
x=1;
read_y=y;
}
});
}
Thread CreateThread2(){
return new Thread(new Runnable() {
@Override
public void run() {
randomSleep();
y=1;
read_x=x;
}
});
}
public static void main(String[] args) {
while (true) {
MemoryTest test = new MemoryTest();
Thread test1 = test.CreateThread1();
Thread test2 = test.CreateThread2();
test1.start();
test2.start();
try {
test1.join();
test2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(String.format("(%d, %d)", test.read_x, test.read_y));
while (test.read_x==0 && test.read_y==0){
new RuntimeException("What?");
}
}
}
}
出错原因:
打乱顺序
内存可见性
1 Memery Model规范
定义Happens-After关系
1、如果操作执行的顺序有先后性
哪种操作必须保持happens-after关系?
1、Unlock发生在Lock之前
2、写Voilte发生在读Voilte之前
3、线程Start发生在所有操作之前
4、线程中所有的操作发生在join之前
5、构造函数完成发生在fianlizer之前
6、Ahppen-after发省传递依赖。