Почему мой синхронизированный метод не работает? - PullRequest
0 голосов
/ 08 мая 2018

Проще говоря, я пытаюсь увидеть разницу при использовании ключевого слова synchronized над простым выполнением функции над потоками без блокировок вообще.

В этом коде:

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

}
}

Он не работает, как я и предполагал, он работает, он возвращает 10000 примерно за 40% прогонов. Это почему? В чем проблема? Я думал, что запуск функции выполняется только 1 потоком за раз, поэтому проблем не должно быть, но, очевидно, я ошибаюсь.

1 Ответ

0 голосов
/ 08 мая 2018

ExecutorService#shutdown не ожидает завершения задач. Вы должны использовать awaitTermination для этого.

См. Документацию для ExecutorService # shutdown .

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

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