synchronized
keyword.
In this case, the locking is performed by Java behind the scenes.
(This is distinct from the programmer using or defining an explicit lock object themselves.)
Each use of the synchronized
keyword is associated with one of the two types of intrinsic lock:
If a method is declared as synchronized
, then it will acquire
either the instance lock or the static lock when it is invoked, according
to whether it is an instance method or a static method.
The two types of lock have similar behaviour, but are completely independent of each other.
Acquiring the instance lock only blocks other threads from invoking
a synchronized
instance method; it does not block other
threads from invoking an un-synchronized method, nor does it block
them from invoking a static synchronized
method.
Similarly, acquiring the static lock only blocks other threads from
invoking a static synchronized
method; it does not block
other threads from invoking an un-synchronized method, nor does
it block them from invoking a synchronized
instance method.
Outside of a method header, synchronized(this)
acquires the
instance lock.
The static lock can be acquired outside of a method header in two ways:
synchronized(Blah.class)
, using the class literalsynchronized(this.getClass())
, if an object is available