Spec-Zone .ru
спецификации, руководства, описания, API
|
Содержание | Предыдущий | Следующий | Индекс | Спецификация Виртуальной машины JavaTM |
Работа
Введите монитор для объекта
Формат
monitorenter
Формы
monitorenter = 194 (0xc2)
Стек операнда
..., objectref...
Описание
objectref должен иметь тип reference
.
Каждому объекту связали монитор с этим. Поток, который выполняет владение усилений monitorenter монитора, связанного с objectref. Если другому потоку уже принадлежит монитор, связанный с objectref, текущий поток ожидает, пока объект не разблокирован, то попробовал еще раз получать владение. Если текущему потоку уже принадлежит монитор, связанный с objectref, это постепенно увеличивает счетчик в мониторе, указывающем на число раз, этот поток ввел монитор. Если монитор, связанный с objectref, не принадлежит никакому потоку, текущий поток становится владельцем монитора, устанавливая количество записи этого монитора к 1.
Исключение на этапе выполнения
Если objectrefnull
, monitorenter бросает aNullPointerException
.
Примечания
Для получения дальнейшей информации о потоках и мониторах в виртуальной машине Java, см. Главу 8, "Потоки и Блокировки."
monitorenter инструкция может использоваться с одной или более monitorexit инструкциями, чтобы реализовать asynchronized
оператор в языке программирования Java. monitorenter и monitorexit инструкции не используются в реализацииsynchronized
методы, хотя они могут использоваться, чтобы обеспечить эквивалентную семантику блокировки; однако, контролируйте запись на вызове asynchronized
метод обрабатывается неявно инструкциями вызова метода виртуальной машины Java. См. Раздел 7.14 для получения дополнительной информации об использовании monitorenter и monitorexit инструкций.
Ассоциацией монитора с объектом можно управлять различными способами, которые выходят за рамки этой спецификации. Например, монитор может быть выделен и освобожден одновременно как объект. Альтернативно, это может быть динамически выделено в то время, когда поток пытается получить эксклюзивный доступ к объекту и освобожденный в некоторое более позднее время, когда никакой поток не остается в мониторе для объекта.
Конструкции синхронизации языка программирования Java требуют поддержки операций на мониторах помимо записи и выхода. Они включают ожидание на мониторе (Object.wait
) и уведомление других потоков, ожидающих на мониторе (Object.notifyAll
иObject.notify
). Эти операции поддерживаются в стандартном пакетеjava.lang
предоставленный виртуальной машиной Java. Никакая явная поддержка этих операций не появляется в наборе команд виртуальной машины Java.
Работа
Монитор выхода для объекта
Формат
monitorexit
Формы
monitorexit = 195 (0xc3)
Стек операнда
..., objectref...
Описание
objectref должен иметь тип reference
.
Текущий поток должен быть владельцем монитора, связанного с экземпляром, на который ссылается objectref. Поток постепенно уменьшает счетчик, указывающий на число раз, это ввело этот монитор. Если в результате значение счетчика становится нулем, текущий поток выпускает монитор. Если монитор, связанный с objectref, становится свободным, другим потокам, которые ожидают, чтобы получить тот монитор, позволяют попытаться сделать так.
Исключения на этапе выполнения
Если objectrefnull
, monitorexit бросает aNullPointerException
.
Иначе, если текущий поток не является владельцем монитора, monitorexit бросает IllegalMonitorStateException
.
Иначе, если реализация виртуальной машины осуществляет правила о структурированном использовании блокировок, описанных в Разделе 8.13 и если второе из тех правил нарушается выполнением этой monitorexit инструкции, то monitorexit бросает IllegalMonitorStateException
.
Примечания
Для получения дальнейшей информации о потоках и мониторах в виртуальной машине Java, см. Главу 8, "Потоки и Блокировки."
Одна или более monitorexit инструкций могут использоваться с monitorenter инструкцией, чтобы реализовать asynchronized
оператор в языке программирования Java. monitorenter и monitorexit инструкции не используются в реализацииsynchronized
методы, хотя они могут использоваться, чтобы обеспечить эквивалентную семантику блокировки.
Виртуальная машина Java поддерживает исключения, выданные в пределахsynchronized
методы иsynchronized
операторы по-другому. Выход монитора на нормальномsynchronized
завершение метода обрабатывается инструкциями возврата виртуальной машины Java. Выход монитора на резкомsynchronized
завершение метода обрабатывается неявно athrow инструкцией виртуальной машины Java. Когда исключение выдается изнутри asynchronized
оператор, выйдите от монитора, вводимого до выполненияsynchronized
оператор достигается, используя механизм обработки исключений виртуальной машины Java. См. Раздел 7.14 для получения дополнительной информации об использовании monitorenter и monitorexit инструкций.
Работа
Создайте новый многомерный массив
Формат
multianewarray indexbyte1 indexbyte2 размерности
Формы
multianewarray = 197 (0xc5)
Стек операнда
..., count1, [count2...]..., arrayref
Описание
Операнд размерностей является байтом без знака, который должен быть больше чем или равным 1. Это представляет число размерностей массива, чтобы быть созданным. Стек операнда должен содержать значения размерностей. Каждое такое значение представляет число компонентов в размерности массива, чтобы быть созданным, должен иметь тип int
, и должно быть неотрицательным. count1 является требуемой длиной в первой размерности, count2 во втором, и т.д..
Все значения количества выталкиваются от стека операнда. indexbyte1 без знака и indexbyte2 используются, чтобы создать индекс в пул константы этапа выполнения текущего класса (§3.6), где значение индекса (indexbyte1 << 8) | indexbyte2. Элемент пула константы этапа выполнения по индексу должен быть символьной ссылкой на класс, массив, или интерфейсный тип. Именованный класс, массив, или интерфейсный тип разрешаются (§5.4.3.1). Получающаяся запись должна быть типом класса массива размерности, больше чем или равный размерностям.
Новый многомерный массив типа массива выделяется от собранной "мусор" "кучи". Если какое-либо значение количества является нулем, никакие последующие размерности не выделяются. Компоненты массива в первой размерности инициализируются к подмассивам типа второй размерности и так далее. Компоненты последней выделенной размерности массива инициализируются к начальному значению по умолчанию для типа компонентов (§2.5.1). A reference
arrayref новому массиву продвигается на стек операнда.
Соединение Исключений
Во время разрешения символьной ссылки на класс, массив, или интерфейсный тип, может быть выдано любое из исключений, задокументированных в Раздел 5.4.3.1.
Иначе, если у текущего класса нет разрешения, чтобы получить доступ к типу элемента разрешенного класса массива, multianewarray бросает IllegalAccessError
.
Исключение на этапе выполнения
Иначе, если какое-либо из значений размерностей на стеке операнда является меньше чем нуль, multianewarray инструкция бросает aNegative
ArraySizeException
.
Примечания
Может быть более эффективно использовать newarray или anewarray, создавая массив единственной размерности.
У класса массива, на который ссылаются через пул константы этапа выполнения, может быть больше размерностей чем операнд размерностей multianewarray инструкции. В этом случае только первые размерности размерностей массива создаются.
Содержание | Предыдущий | Следующий | Индекс
Спецификация Виртуальной машины JavaTM
Авторское право © Sun Microsystems, Inc 1999 года. Все права защищены
Пожалуйста, отправьте любые комментарии или исправления к jvm@java.sun.com