为了账号安全,请及时绑定邮箱和手机立即绑定

一个简单多线程资源共享问题,不明白为什么会出现奇数结果

一个简单多线程资源共享问题,不明白为什么会出现奇数结果

富国沪深 2019-03-20 15:15:52
代码为下面:为什么运行会出现奇数结果? 《java编程思想》的里面的解释没有看懂,能够请大神解释一下其中原理。import java.util.concurrent.*;public class EvenGenerator extends IntGenerator {  private int currentEvenValue = 0;  public int next() {    ++currentEvenValue; // Danger point here!    ++currentEvenValue;    return currentEvenValue;  }  public static void main(String[] args) {    EvenChecker.test(new EvenGenerator() ,10);  }} public class EvenChecker implements Runnable {  private IntGenerator generator;  private final int id;  public EvenChecker(IntGenerator g, int ident) {    generator = g;    id = ident;  }  public void run() {    while(!generator.isCanceled()) {      int val = generator.next();    //   System . out . println ( val ) ;               if(val % 2 != 0) {        System.out.println(val + " not even!");        generator.cancel(); // Cancels all EvenCheckers      }    }  }  // Test any type of IntGenerator:  public static void test(IntGenerator gp, int count) {    System.out.println("Press Control-C to exit");    ExecutorService exec = Executors.newCachedThreadPool();    for(int i = 0; i < count; i++)      exec.execute(new EvenChecker(gp, i));    exec.shutdown();  }   }}
查看完整描述

2 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

第一个问题, 因为i++不是原子操作,stackOverflow回答
第二个问题, 是因为你试的次数不多。

查看完整回答
反对 回复 2019-04-17
  • 2 回答
  • 0 关注
  • 616 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信