
public class Demo10 {
int i = 0;
boolean isRunning = true;
public static void main(String[] args) throws InterruptedException {
Demo10 demo = new Demo10();
new Thread(() -> {
System.out.println("here i am ...");
while (demo.isRunning) {
demo.i++;
}
System.out.println(demo.i);
}).start();
Thread.sleep(3000);
demo.isRunning = false;
System.out.println("shutdown ...");
}
}
参数 | 32 位 JDK | 64 位 JDK |
|---|---|---|
-server | 不打印i的值 | 不打印i的值 |
-client | 打印i的值 | 不打印i的值 |


isRunning添加volatile关键字即可。volatile boolean isRunning = true;f=new finalDemo(); 读取到的 f.x 一定最新,x 为 final 字段。public finalDemo() {x=1;y=x;}; y会等于1。r=new ReferenceObj(); k=r.f; 这两个操作不能重排序。System.in、System.out、System.err被static final修饰,却可以修改,遗留问题,必须允许通过set方法修改,我们将这些字段称为写保护,以区别于普通的final字段。
<img src="https://oscimg.oschina.net/oscnet/up-f133a960110d3ad875503e282867080e111.png" width="400"/>
<img src="https://oscimg.oschina.net/oscnet/up-72d5ed20299b069c63f84ef9edb43825384.png" width="400"/>
