代码为下面:
为什么运行会出现奇数结果? 《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(); } } }
多条线程交叉执行,修改变量currentEvenValue,执行++currentEvenValue操作,currentEvenValue可能的值可以为,2、3、4、5、6、7、8、9、10、11、12、13.。。。,而且对于java来说,int类型的变量,是否为原子操作、线程操作是否安全,估计是不确定的,这样交叉操作currentEvenValue,很可能出现异常。
第一个问题, 因为i++不是原子操作,stackOverflow回答
第二个问题, 是因为你试的次数不多。