Throughout this chapter on synchronization, we kept
referring to “obtaining the object lock.” But what about
When a synchronized static method is called, which object
are we referring to? A static method does not have a
concept of the
this reference. It is not possible
to obtain the object lock of an object that does not exist. So how
does synchronization of static methods work? To answer this question,
we will introduce the concept of a class lock. Just as there is an
object lock that can be obtained for each instance of a class
(object), there is a lock that can be obtained for each class. We
will refer to this as the class lock
. In terms of
implementation, there is no such thing as a class lock, but it is a
useful concept to help us understand how this all works.
When a static synchronized method is called, the program obtains the class lock before calling the method. This mechanism is identical to the case in which the method is not static; it is just a different lock. The same rule applies: if a synchronized static method calls another synchronized static method of the same class, the system is smart enough to support the nesting of class locks.
But how is the class lock related to the object lock? Apart from the functional relationship between the two locks, they are not operationally related at all. These are two distinct locks. The class lock can be grabbed and released independently of the object lock. If a nonstatic ...