Deadlock in AWT if methods of the applet are over-synchronized
Symptoms
When running an applet in a browser using the Sun JRE, deadlock may occur
if methods of the applet are over-synchronized, especially those inherited
from java.awt.Component. The same applet runs under the Microsoft
VM.
Cause
The AWT class libraries are sometimes used by developers as thread-safe
class libraries. Applets performed actions through the AWT using multiple
threads, with the assumption that the class libraries would take care of
synchronization issues.
However , the AWT class libraries guarantee thread safety only when calls
are made from the AWT event dispatch thread. Because the implementation
of the Microsoft VM and Sun differs, thread-unsafe code that runs without
incident under one VM might fail under another.
One bad practice used by some applets is to synchronize every method of
an applet to avoid possible race conditions or deadlocks in the Microsoft
VM. However, this practice may result in deadlocks.
Resolution
To work around this problem, use synchronization in the applet only where
it is really needed, and remove unnecessary synchronization. For example:
public synchronized void
paint(Graphics g) {
....
}
public synchronized void dispose() {
super.dispose();
.....
}
public synchronized void stop() {
....
}
public synchronized void destroy() {
....
}
In this case, the synchronized keyword in the paint,
dispose, stop, and destroy methods
should be removed because they are always called from a dedicated thread:
paint and dispose by the AWT event dispatching
thread; stop and destroy by the applet thread.
The code should be changed as follows:
public void paint(Graphics
g) {
....
}
public void dispose() {
super.dispose();
.....
}
public void stop() {
....
}
public void destroy() {
....
}
Related Information
The Java Tutorial discusses
thread issues and techniques that apply both to AWT and Swing programs: How
to Use Threads.