| |
усть при этом на счету находится 5 млн. долларов, а оба процесса
пытаются снять с него по 3 млн. долларов.
Допустим, события разворачиваются следующим образом:
* первый процесс проверяет состояние текущего счета и убеждается, что на нем
хранится 5 млн. долларов;
* второй процесс проверяет состояние текущего счета и также убеждается, что на
нем хранится 5 млн. долларов;
* первый процесс уменьшает счет на 3 млн. долларов и записывает остаток (2 млн.
долларов) на текущий счет;
* второй процесс выполняет ту же самую операцию, так как после проверки считает,
что на счету по-прежнему хранится 5 млн. долларов.
В результате получилось, что со счета, на котором находилось 5 млн. долларов,
было снято 6 млн. долларов, и при этом там осталось еще 2 млн. долларов! Итого
- банку нанесен ущерб в 3 млн. долларов.
Как же составить программу уменьшения счета, чтобы она не позволяла
вытворять подобное?
Очень просто - на время выполнения операций над счетом одним процессом
необходимо запретить доступ к этому счету со стороны других процессов. В этом
случае сценарий работы программы должен быть следующим:
* процесс блокирует счет для выполнения операций другими процессами, получая
его в монопольное владение;
* процесс проводит процедуру уменьшения счета и записывает на текущий счет
новое значение остатка;
* процесс разблокирует счет, разрешая другим процессам выполнение операций.
Когда первый процесс блокирует счет, он становится недоступен другим
процессам. Если второй процесс также попытается заблокировать этот же счет, он
будет переведен в состояние ожидания. Когда первый процесс уменьшит счет и на
нем останется 2 млн. долларов, второй процесс будет разблокирован. Он проверит
остаток, убедится, что сумма недостаточна и не будет проводить операцию.
Таким образом, в мультизадачной среде необходима синхронизация задач при
обращении к критическим ресурсам. Если над такими ресурсами будут выполняться
операции в неправильной последовательности, это приведет к возникновению трудно
обнаруживаемых ошибок.
В языке программирования Java предусмотрено несколько средств для
синхронизации задач, которые мы сейчас рассмотрим.
Синхронизация методов
Возможность синхронизации как бы встроена в каждый объект, создаваемый
приложением Java. Для этого объекты сна
|
|