返回信息流《Effective Java中文版 第2版》,并发一章第一节,230页的例子。照着写了个类
#######################################################################
package main;
import java.util.concurrent.TimeUnit;
public class TowTest {
private static boolean mark;
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(new Runnable(){
public void run(){
int i = 0;
while(!mark){
i++;
System.out.println("111");
}
}
});
t.start();
TimeUnit.SECONDS.sleep(1);
mark = true;
System.out.println(mark);
}
}
#######################################################################
书中说程序永远不会停止,我运行的结果是可以正常停止。JDK1.6做的。
什么原因啊?书中写错了吗?
这是一条镜像帖。来源:北邮人论坛 / java / #47991同步于 2016/2/25
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
请教《Effective Java中文版 第2版》中看到的并发问题
truthman
2016/2/25镜像同步6 回复
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
【补充】
书中说虚拟机将代码
while(!mark){
i++;
System.out.println("111");
}
转换为
if(!mark)
while(true){
i++;
System.out.println("111");
}
测试一下,转化后的确就一直循环了。可能是JVM的原因。我用的JVM应该跟书中例子用的JVM版本不一样。
【 在 truthman 的大作中提到: 】
: 《Effective Java中文版 第2版》,并发一章第一节,230页的例子。照着写了个类
: #######################################################################
: package main;
: ...................
兄弟,你转化后的代码有问题,每次while都不再判断mark了,当然会无限循环。
至于第一个问题应该是有关Java内存模型的,mark在多个线程见不一定同步。http://www.infoq.com/cn/articles/java-memory-model-1
【 在 truthman 的大作中提到: 】
: 书中说虚拟机将代码
: while(!mark){
: i++;
: ...................
对,转化后逻辑都变了,书上原文,不知道到底咋回事了。后面那个好好看看,多谢!
【 在 aiquestion 的大作中提到: 】
: 兄弟,你转化后的代码有问题,每次while都不再判断mark了,当然会无限循环。
: 至于第一个问题应该是有关Java内存模型的,mark在多个线程见不一定同步。http://www.infoq.com/cn/articles/java-memory-model-1
: