|
Spec-Zone .ru
спецификации, руководства, описания, API
|
Выполняя апплет в браузере, используя Sun Среда выполнения Java™ (JRE™), мертвая блокировка может произойти, если методы апплета сверхсинхронизируются, особенно наследованные от java.awt.Component. Тот же самый апплет работает под Microsoft Virtual Machine (VM).
Библиотеки классов AWT иногда используются разработчиками в качестве ориентированных на многопотоковое исполнение библиотек классов. Выполняемые действия апплетов через AWT использование многократных потоков, учитывая, что библиотеки классов заботились бы о проблемах синхронизации.
Однако, библиотеки классов AWT гарантируют потокобезопасность только, когда вызовы будут выполнены от события AWT, диспетчеризируют поток. Поскольку реализация Microsoft VM и Sun отличается, опасный потоком код, который работает без инцидентного под одним VM, мог бы перестать работать под другим.
Одна плохая практика, используемая некоторыми апплетами, должна синхронизировать каждый метод апплета, чтобы избежать возможных условий гонки или мертвых блокировок в Microsoft VM. Однако, эта практика может привести к мертвым блокировкам.
Чтобы работать вокруг этой проблемы, используйте синхронизацию в апплете только там, где это действительно необходимо, и удалите ненужную синхронизацию. Например:
public synchronized void paint(Graphics g) {
....
}
public synchronized void dispose() {
super.dispose();
.....
}
public synchronized void stop() {
....
}
public synchronized void destroy() {
....
}
В этом случае, synchronized ключевое слово в paint, dispose, stop, и destroy методы должны быть удалены, потому что их всегда вызывают от выделенного потока: paint и dispose потоком диспетчеризации события AWT; stop и destroy потоком апплета. Код должен быть изменен следующим образом:
public void paint(Graphics g) {
....
}
public void dispose() {
super.dispose();
.....
}
public void stop() {
....
}
public void destroy() {
....
}
Учебное руководство по Java обсуждает проблемы потока и методы, которые применяются и к AWT и к программам Swing: .