62,615
社区成员
发帖
与我相关
我的任务
分享
public class VolatileThread extends Thread {
private int count = 1;
public void setCount(int count){
this.count = count;
}
public void run() {
System.out.println("进入run方法");
while(count >0){
// count++;
//System.out.println(Thread.currentThread().getName() + " count= " + count);
// System.out.println("123");
}
System.out.println("线程停止");
}
public static void main(String[] args) throws InterruptedException {
VolatileThread vt1 = new VolatileThread();
vt1.start();
Thread.sleep(1000);
vt1.setCount(-1);
}
}
结果
进入run方法
public class VolatileThread extends Thread {
private int count = 1;
public void setCount(int count){
this.count = count;
}
public void run() {
System.out.println("进入run方法");
while(count >0){
// count++;
//System.out.println(Thread.currentThread().getName() + " count= " + count);
System.out.println("123");
}
System.out.println("线程停止");
}
public static void main(String[] args) throws InterruptedException {
VolatileThread vt1 = new VolatileThread();
vt1.start();
Thread.sleep(10);
vt1.setCount(-1);
}
}
结果
进入run方法
123
123
123
123
123
123
123
123
线程停止
public void println(String x) {
synchronized (this) {
print(x);
newLine();
}
}
该方法中有同步操作 同步操作的内存语义和volatile关键字类似 会对内存可见性产生影响(当然在内存模型中保证可见性的应该是不同线程对同一个监视器的获取和释放, 严格来说这样是确保可见性的充分条件但是根据底层实现的不同却未必是必要条件, 因此就算只是单个线程中有类似这种操作也可能改变内存可见性, 只不过在规范中不做保证而已)
另一方面打印操作属于是会对外部产生可见的影响的操作 因为用户可以在控制台看见打印出来的内容 这类操作在内存模型中也是有一些特殊对待的 例如不会被重排序 所以也可能会对多线程运行效果产生不可预测的影响