duh*_*kal 3 java multithreading volatile
在这种情况下应该int a是易失性的以保证线程之间的可见性吗?
private volatile static int a = 0;
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
a = 10;
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println(a);
}
});
t1.start();
t2.start();
}
Run Code Online (Sandbox Code Playgroud)
输出
10
Run Code Online (Sandbox Code Playgroud)
语言规范中明确定义了happens-before,请先阅读它;首先。
然后,要完全理解发生了什么,您需要知道程序顺序是什么,以及同步顺序。
简而言之,请看下面的内容:
private volatile static int a = 0;
private static int b = 0;
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
b = 100;
a = 10;
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
if(a == 10){
System.out.println(b);
}
}
});
t1.start();
t2.start();
}
Run Code Online (Sandbox Code Playgroud)
您拥有的唯一保证是,当且仅当t2打印某些内容时,它将始终是100。这是因为看到t2了一个来。发生这种情况是因为从写入线程到读取线程,已经建立了“发生之前”,并且保证之前完成的每个操作对于已经看到该操作的线程是可见的。volatile writeaa = 10a10