Java Threads - функция Syn синхронизируется c с несколькими возвращаемыми значениями из потоков. - PullRequest
1 голос
/ 18 февраля 2020

Это просто концепция:

  • Я хочу обновить int с помощью функции, которая выполняется в нескольких потоках.
  • Моя функция случайным образом выбирает int и проверяет, является ли он больше существующего типа int.
  • Если это так, он обновляет переменную.

Как мне убедиться, что мои значения никогда не равны sh или моя функция смотрит на более старую значение еще не обновлено?

Я новичок в темах, поэтому любая информация полезна.

Ответы [ 2 ]

2 голосов
/ 18 февраля 2020

Это работа для AtomicInteger!

AtomicInteger atomic;
...
int newValue = atomic.accumulateAndGet​(rand, Math::max);
1 голос
/ 18 февраля 2020

Как я могу гарантировать, что мои значения никогда не будут sh?

Если вы новичок в потоках, то я бы сказал, используйте синхронизированный блок:

final Object lock = new Object();
int global_r = 0;
...
while (true) {
    int r = random.nextInt();
    synchronized(lock) {
        if (r > global_r) {
            global_r = r;
            break;
        }
    }
}

Только один поток одновременно может войти в блок synchronized(lock).... Поток, который пытается, когда другой поток уже находится в нем, будет вынужден ждать.

Всегда следует стараться, чтобы потоки проводили как можно меньше времени внутри блока synchronized(...), поэтому я генерирую случайное число номер за пределами блока, и выполняйте только тест и присвоение внутри него.


Другой ответ здесь предполагает, что вы используете AtomicInteger. Это тоже работает, но это не то, что я бы порекомендовал тем, кто делает первые шаги к пониманию того, как использовать потоки.

...