Я не понимаю, как работают потоки в этом случае - PullRequest
0 голосов
/ 02 ноября 2018

Следующий код показывает, как не работает условие гонки в потоке, но я не вижу разницы между синхронизированным и без него. Я думал, что счетчик статических переменных будет добавлен к 20000 в любом случае, но оказалось, что без синхронизированного счетчика будет меньше, чем 20000. Не могли бы вы объяснить, как работают потоки в этом случае? Кроме того, в Java потоки на самом деле не работают "одновременно", вместо этого они по очереди работают некоторое время?

public class NoRaceCondition implements Runnable {
    private static int counter = 0;
    private static Object gateKeeper = new Object();

    public static void main(String[] args) {
        Thread t1 = new Thread(new NoRaceCondition());
        Thread t2 = new Thread(new NoRaceCondition());
        t1.start();
        t2.start();
        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) { e.printStackTrace(); }
        System.out.printf("counter = %d\n", counter);
    }

    public void run() {
        synchronized (gateKeeper) {
            for (int i = 0; i < 10000; i++) {
                {
                    counter++;
                }
            }
        }
    }
}

1 Ответ

0 голосов
/ 02 ноября 2018

Вы можете думать о count++ как о 3 отдельных шагах.

  1. прочитайте значение count
  2. увеличить значение
  3. переопределить count новым увеличенным значением

Когда несколько потоков одновременно выполняют описанные выше шаги, могут возникнуть условия гонки. 1 пример состояния гонки:

Пусть count = 1

Пусть будет 2 потока с именами A и B

Поток A читает значение count и получает 1

Поток B читает значение count и получает 1

Поток A увеличивает свое значение и получает 2

Поток B увеличивает свое значение и получает 2

Поток A записывает значение в count

count теперь 2

Поток B записывает значение в count

count теперь равно 2, когда ожидается, что будет 3 после 2 приращений

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...