volatile 的问题

beysion 2009-04-15 03:45:37
public class Init {
static volatile boolean done = false;
static {
new Thread() {
public void run() {
System.out.println("enter thread");
done = true;
}
}.start();
while (!done)
;
}

public static void main(String[] args) {
System.out.println("Finished");
}
}
为什么字段加了volatile修饰符,while(!done)还会死循环啊?
请指教
...全文
65 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
qybao 2009-04-15
  • 打赏
  • 举报
回复
public class Init {
static volatile boolean done = false;
static {
new Thread() {
public void run() {
System.out.println("enter thread");
done = true; //如果线程还来不及执行,这里就不会被执行
}
}.start(); //这里线程不一定马上就能看是
while (!done) { //所以直接走到这里就死循环了
try{Thread.yield();} catch(Thrwable e){}; //加上试试看
}

public static void main(String[] args) {
System.out.println("Finished");
}
}

volatile变量是多线程处理时,一个线程改变了该变量的值,其他的线程能立刻感知该变量的值的变化
volatile变量主要是针对当时的8位16位机的非连续寻址而设计的,现在32位机很少用,能避免则尽量避免


sjkof 2009-04-15
  • 打赏
  • 举报
回复
想要同步还是多用sychronized
sjkof 2009-04-15
  • 打赏
  • 举报
回复
volatile最好别用,容易错
对于表达式两边都有done的,好像就会有问题,比如:done = !done;
因为这种操作不是原子的

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧