ExecutorService没有做好自己的工作?

时间:2012-07-26 09:34:54

标签: java multithreading

这个主要给予ExecutorService 1000 runnables(测试者)所有他们所做的就是睡10毫秒,然后将1添加到一个静态计数器,主要假设等待直到所有执行完成,但是计数器达到某种程度在970次执行中......为什么?

public class Testit {
    public static void main (String arg[]) {
        int n=1000;
        ExecutorService e1 =  Executors.newFixedThreadPool(20);
        for (int i=0 ;i <n ;i++) {
            e1.execute(new Tester());
        }
        e1.shutdown();
        try {
            e1.awaitTermination(1, TimeUnit.DAYS);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Executed "+Tester.tester()+" Tasks.");
    }
}

和Tester Class:

public class Tester implements Runnable {
    public static long tester=0;
    @Override
    public void run() {
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        finally { tester++; }
    }
    public static long tester() {
        long temp=tester;
        tester=0;
        return temp;
    }
}

修改

问题解决了:

finally { synchronized (lock) {tester++;} } 

感谢JB Nizet!

1 个答案:

答案 0 :(得分:6)

因为您没有同步对计数器的访问,并且因为写long不是原子的,并且++也不是,两个并发计数器的并发线程可能导致完全不一致的结果,或者只有一个增量而不是2个。

改为使用AtomicLong,并在此incrementAndGet()上致电AtomicLong