为什么我的同步方法不起作用?

时间:2018-05-08 12:07:22

标签: java concurrency executorservice

简单地说,我试图看到使用sychronized关键字而不仅仅是在没有锁的线程上运行函数时的区别。

在此代码中:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.IntStream;


public class mainClass {
static int count=0;

public static void main(String[] args) {
    ExecutorService executor = Executors.newFixedThreadPool(2);
    Runnable r =new Runnable() {

        public synchronized void run() {
            count = count + 1;
        }
    };
    IntStream.range(0, 10000)
            .forEach(i -> executor.submit(r::run));

    executor.shutdown();

    System.out.println(count);  // 10000

}
}

它不起作用,因为我预测它起作用,它在40%的运行中返回10000。这是为什么?问题出在哪儿? 我认为函数运行一次只运行一个线程,所以应该没有问题,但显然我错了。

1 个答案:

答案 0 :(得分:4)

ExecutorService#shutdown不等待任务完成。您应该使用awaitTermination

请参阅documentation for ExecutorService#shutdown

IntStream.range(0, 10000)
        .forEach(i -> executor.submit(r::run));

executor.shutdown();
executor.awaitTermination(1, TimeUnit.MINUTE); // <!-- HERE