Вы заметили состояние гонки в примере многопоточности в Java? Как с этим бороться?

Опубликовано: 2019-12-11

вы заметили-состояние-гонки-в-примере-многопоточности-параллелизма-java

Некоторое время назад я написал статью о примере Producer Consumer и о том, как лучше обрабатывать операции чтения/записи в Java. Аналогично, в этом уроке мы обсудим Race Condition и Thread locking .

Если у вас есть какие-либо из следующих вопросов, то вы находитесь в правильном месте:

  • Пример условия гонки Java
  • пример мьютекса java
  • многопоточность — что такое состояние гонки?
  • Условия гонки и критические участки
  • Что такое состояние гонки?
  • Как справиться с состоянием гонки в Java на примере

Почему возникает состояние гонки в Java?

Состояние гонки в Java возникает, когда two or more threads пытаются same time изменить/обновить общие данные.

Давайте посмотрим на логику программы ниже:

Это очень простой банковский пример, в котором вы будете deposit и withdraw суммы 100 times . Вы вносите 100 долларов в общей сложности 100 раз = 100 x 100 = 10 000 долларов и снимаете всего 50 долларов 100 раз = 50 x 100 = 5 000 долларов. По окончании программы в вашем банке должно быть 5000 долларов.

Вот шаги:

  1. Создайте класс CrunchifyRaceCondition.java
  2. Создать класс CrunchifyTransaction.java
  3. Создайте класс CrunchifyBankAccount.java
  4. Мы запустим класс CrunchifyRaceCondition, и он запустит цикл ввода и вывода средств 100 раз.
  5. Мы запустим его with Synchronized block чтобы проверить результат.
  6. Мы запустим его without Synchronized block чтобы проверить результат.

CrunchifyRaceCondition.java

CrunchifyTransaction.java

CrunchifyBankAccount.java

Пожалуйста, проверьте строки 24 и 34 выше. Сохраните это ключевое слово Synchronized и запустите свою программу. Вы должны увидеть правильный результат, как показано на изображении ниже.

Ключевое слово синхронизированного блока Java — Crunchify

Теперь удалите ключевое слово synchronized из строк 24 и 34 и запустите ту же программу.

Возможно, вам придется запустить эту программу несколько раз, чтобы увидеть проблему. В java нет гарантии, что вы все время будете видеть состояние гонки.

Java без ключевого слова синхронизированного блока - Crunchify

Если у вас есть приложение уровня предприятия, и вы говорите о миллионах транзакций в секунду, то состояние гонки может привести к катастрофе для вашей компании.

Теперь вопрос в том, как избежать состояния гонки в вашем Java-приложении?

  1. Если состояние гонки связано с обновлениями некоторых общих структур данных в памяти, вам необходимо синхронизировать доступ и обновления к структуре данных соответствующим образом.
  2. Если состояние гонки находится в обновлениях вашей базы данных, вам необходимо реструктурировать свой SQL, чтобы использовать транзакции на соответствующем уровне детализации.
  3. Неплохая идея провести нагрузочное тестирование перед запуском в производство. Большая нагрузка может вызвать редкое состояние гонки. Лучше исправить до того, как исправить потом.
  4. Убедитесь, что у вас нет глобальной переменной, в которую вы записываете.
  5. В Java каждый объект имеет один и только один монитор и связанный с ним мьютекс. Однако у одного монитора есть несколько дверей, каждая из которых обозначена ключевым словом synchronized . Когда поток проходит через ключевое слово synchronized , он эффективно запирает все двери.
  6. Конечно, если поток не проходит через ключевое слово synchronized , он не запер дверь, и какой-то другой поток может свободно ворваться в любое время.