Программирование на JAVA
Меню :
Стартовая
Основы программирования
Программирование на JAVA
Программирование на C++
Программирование на Pascal
Задачи по программированию
Следует обратить внимание на два 64-разрядных типа, double и jbng. Поскольку многие платформы поддерживают лишь 32-битную память, величины этих типов рассматриваются как две переменные и все описанные действия выполняются независимо для двух половинок таких значений. Конечно, если производитель виртуальной машины считает возможным, он может обеспечить атомарность операций и над этими типами. Для volatile переменных это является обязательным требованием.
Блокировки
В основном хранилище для каждого объекта поддерживается блокировка (lock), над которой можно произвести два действия - установить Cock) и снять (unlock). Только один поток в один момент времени может ''^тановить блокировку на некоторый объект. Если до того, как этот поток Выполнит операцию unlock, другой поток попытается установить блокировка' его выполнение будет приостановлено до тех пор, пока первый поток не ^ститее.
Операции lock и unlock накладывают жесткое ограничение на работу Переменными в рабочей памяти потока. После успешно выполненного
lock рабочая память очищается и все переменные необходимо заново считывать из основного хранилища. Аналогично, перед операцией unlock необходимо все переменные сохранить в основном хранилище.
Важно подчеркнуть, что блокировка является чем-то вроде флага Если блокировка на объект установлена, это не означает, что данным объектом нельзя пользоваться, что его поля и методы становятся недоступными,— это не так. Единственное действие, которое становится невозможным,— установка этой же блокировки другим потоком, до тех пор, пока первый поток не выполнит unlock.
В Java-программе для того, чтобы воспользоваться механизмом блокировок, существует ключевое слово synchronized. Оно может быть применено в двух вариантах — для объявления synchronized-блока и как модификатор метода. В обоих случаях действие его примерно одинаковое.
Synchronized-блок записывается следующим образом:
synchronized (ref) {
}
Прежде, чем начать выполнять действия, описанные в этом блоке, поток обязан установить блокировку на объект, на который ссылается переменная ref (поэтому она не может быть null). Если другой поток уже установил блокировку на этот объект, то выполнение первого потока приостанавливается до тех пор, пока не удастся выполнить операцию lock.