class PrintStrint implements Runnable {
private boolean isContinuePrint = true;
public boolean isContinuePrint() {
return isContinuePrint;
}
public void setContinuePRint(boolean isContinuePring) {
this.isContinuePrint = isContinuePring;
}
public void Print() {
System.err.println("进入run");
while (isContinuePrint) {
//System.err.println("Thread = "+ Thread.currentThread().getName());
//Thread.sleep(1);
}
System.out.println("线程被停止了");
}
@Override
public void run() {
Print();
}
}
public class TestPrintStrint {
public static void main() {
try {
PrintStrint ps = new PrintStrint();
new Thread(ps).start();
Thread.sleep(1000);
System.err.println("已经被 赋值了false" + Thread.currentThread().getName());
ps.setContinuePRint(false);
} catch (InterruptedException e) {
}
}
}
执行结果是:一直在死循环,但是放开system.out.println()操作后,变量就可见了,为什么呢?
看一下源码
public void println(String x) {
synchronized (this) {
print(x);
newLine();
}
}
使用了 synchronized 上锁会做以下操作:
- 获得同步锁;
- 清空工作内存;
- 从主内存拷贝对象副本到工作内存;
- 执行代码(计算或者输出等);
- 刷新主内存数据;
- 释放同步锁
补充一下 sleep也会影响内存可见