请问多线程的例子,明明是输出偶数的,怎么回事?在线等,解决了就加分!!

super_sy 2006-03-18 10:59:01
public class AlwaysEven {
private int i;
public void next() { i++; i++; }
public int getValue() { return i; }
public static void main(String[] args) {
final AlwaysEven ae = new AlwaysEven();
new Thread("Watcher") {
public void run() {
while(true) {
int val = ae.getValue();
if(val % 2 != 0) {
System.out.println(val);
System.exit(0);
}
}
}
}.start();
while(true)
ae.next();
}
}

是都应该产生偶数吧,但是为什么会有奇数打印出来呢?
在线等,解决了就加分!!!!
...全文
124 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
super_sy 2006-03-18
  • 打赏
  • 举报
回复
有点明白了,谢谢!!
Gorgr 2006-03-18
  • 打赏
  • 举报
回复
这是线程运行时的很容易出错的问题,
public synchronized void next() {
i++;
i++;
}
如果你有两个线程运行,在第一个next()执行后,getValue()执行前,就容易出现问题
因为线程你是不知道何时运行的。
可以枷锁,象楼上说的加synchronized
super_sy 2006-03-18
  • 打赏
  • 举报
回复
val % 2 != 0 这个条件不是输出奇数吗?

是输出奇数,但是应该没输出啊
super_sy 2006-03-18
  • 打赏
  • 举报
回复
public synchronized void next() {
i++;
i++;
}

改成这样吧

这样一样啊
interpb 2006-03-18
  • 打赏
  • 举报
回复
是同步的问题

加上同步关键字
interpb 2006-03-18
  • 打赏
  • 举报
回复
public synchronized void next() {
i++;
i++;
}

改成这样吧
林巅峰 2006-03-18
  • 打赏
  • 举报
回复
val % 2 != 0 这个条件不是输出奇数吗?

62,629

社区成员

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

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