-
when synchronizing access to data or methods, be careful, you can end up in deadlock
-
occurs when there is a cycle of threads waiting for each other.
Example: Suppose we have the following code, and gerenerate 2 threads each waiting on data from the other one:
class Foo{private int x=0;synchronized void setMaximum(int v, Foo f) { x = Math.max(v,f.getValue()); }synchronized int getValue(){ return x; }}
|
Thread 1 | Thread 2 |
aquire lock on a | |
aquire a lock on b | |
attempt call to b.getValue() | |
wait* | |
attempt call to a.getValue() | |
wait* |
*wait was invoked by the JVM switching which is the current thread of a set of equal priority threads.
Avoiding Deadlock
You can avoid problems like the example above by making sure that synchronized methods never call (directly or indirectly) synchronized methods on other objects (that could be locked by other threads).