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

代码为下面:


为什么运行会出现奇数结果? 《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();

  }

 

  }

}


富国沪深
浏览 617回答 2
2回答

拉莫斯之舞

第一个问题, 因为i++不是原子操作,stackOverflow回答第二个问题, 是因为你试的次数不多。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java