Druzya.org
Возьмемся за руки, Друзья...
 
 
Наши Друзья

Александр Градский
Мемориальный сайт Дольфи. 
				  Светлой памяти детей,
				  погибших  1 июня 2001 года, 
				  а также всем жертвам теракта возле 
				 Тель-Авивского Дельфинариума посвящается...

Библиотека :: Компьютеры и Программирование :: А.В. Фролов, Г.В. Фролов - Microsoft Visual J++
<<-[Весь Текст]
Страница: из 275
 <<-
 
усть при этом на счету находится 5 млн. долларов, а оба процесса 
пытаются снять с него по 3 млн. долларов. 
   Допустим, события разворачиваются следующим образом:
* первый процесс проверяет состояние текущего счета и убеждается, что на нем 
хранится 5 млн. долларов;
* второй процесс проверяет состояние текущего счета и также убеждается, что на 
нем хранится 5 млн. долларов;
* первый процесс уменьшает счет на 3 млн. долларов и записывает остаток (2 млн. 
долларов) на текущий счет;
* второй процесс выполняет ту же самую операцию, так как после проверки считает,
 что на счету по-прежнему хранится 5 млн. долларов.
   В результате получилось, что со счета, на котором находилось 5 млн. долларов,
 было снято 6 млн. долларов, и при этом там осталось еще 2 млн. долларов! Итого 
- банку нанесен ущерб в 3 млн. долларов.
   Как же составить программу уменьшения счета, чтобы она не позволяла 
вытворять подобное?
   Очень просто - на время выполнения операций над счетом одним процессом 
необходимо запретить доступ к этому счету со стороны других процессов. В этом 
случае сценарий работы программы должен быть следующим:
* процесс блокирует счет для выполнения операций другими процессами, получая 
его в монопольное владение;
* процесс проводит процедуру уменьшения счета и записывает на текущий счет 
новое значение остатка;
* процесс разблокирует счет, разрешая другим процессам выполнение операций.
   Когда первый процесс блокирует счет, он становится недоступен другим 
процессам. Если второй процесс также попытается заблокировать этот же счет, он 
будет переведен в состояние ожидания. Когда первый процесс уменьшит счет и на 
нем останется 2 млн. долларов, второй процесс будет разблокирован. Он проверит 
остаток, убедится, что сумма недостаточна и не будет проводить операцию.
   Таким образом, в мультизадачной среде необходима синхронизация задач при 
обращении к критическим ресурсам. Если над такими ресурсами будут выполняться 
операции в неправильной последовательности, это приведет к возникновению трудно 
обнаруживаемых ошибок.
   В языке программирования Java предусмотрено несколько средств для 
синхронизации задач, которые мы сейчас рассмотрим.
   Синхронизация методов
   Возможность синхронизации как бы встроена в каждый объект, создаваемый 
приложением Java. Для этого объекты сна
 
<<-[Весь Текст]
Страница: из 275
 <<-