Программирование на Java



Синхронизация потоков - часть 2


  • второй процесс выполняет ту же самую операцию, так как после проверки считает, что на счету по-прежнему хранится 5 млн. долларов.
  • В результате получилось, что со счета, на котором находилось 5 млн. долларов, было снято 6 млн. долларов, и при этом там осталось еще 2 млн. долларов! Итого - банку нанесен ущерб в 3 млн. долларов.

    Как же составить программу уменьшения счета, чтобы она не позволяла вытворять подобное?

    Очень просто - на время выполнения операций над счетом одним процессом необходимо запретить доступ к этому счету со стороны других процессов. В этом случае сценарий работы программы должен быть следующим:

  • процесс блокирует счет для выполнения операций другими процессами, получая его в монопольное владение;
  • процесс проводит процедуру уменьшения счета и записывает на текущий счет новое значение остатка;
  • процесс разблокирует счет, разрешая другим процессам выполнение операций.
  • Когда первый процесс блокирует счет, он становится недоступен другим процессам. Если второй процесс также попытается заблокировать этот же счет, он будет переведен в состояние ожидания. Когда первый процесс уменьшит счет и на нем останется 2 млн. долларов, второй процесс будет разблокирован. Он проверит остаток, убедится, что сумма недостаточна и не будет проводить операцию.

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

    В языке программирования Java предусмотрено несколько средств для синхронизации потоков, которые мы сейчас рассмотрим.




    Содержание  Назад  Вперед