I have 4 methods (m1
, m2
, m3
and m4
) in a class. Method m1
, m2
and m3
are synchronized
methods. Also, I have 4 threads t1
, t2
, t3
and t4
respectively.
If t1
access the m1
method (synchronized method), could t2
thread access m2
method (synchronized method) simultaneously? If not what would be the state of t2?
No, it couldn't. That's the only point there is to
synchronized
: different threads can't do these things simultaneously (You don't have to guard against the same thread doing them simultaneously, because a single thread can't do anything in parallel at all.) The state of the waiting thread is 'waiting for lock'. (With a sufficiently modern JVM you can actually have this state displayed on the console if you ask in the right way.)The
synchronized
keyword applies on object level, and only one thread can hold the lock of the object. So as long as you're talking about the same object, then no,t2
will wait fort1
to release the lock acquired when it enteredm1
.The thread can however release the lock without returning from the method, by calling
Object.wait()
.It would sit tight and wait for
t1
to release the lock (return from the method or invokeObject.wait()
). Specifically, it will be in aBLOCKED
state.Sample code:
Output:
If the methods are synchronized on the same monitor, then they cannot execute simultaneously in different threads. When the second thread comes to the monitor entry (the start of the synchronized method in this case), it will block until the first thread releases the monitor.
The actual state of the blocked thread in this case, as reported by jconsole, will be something like
java.lang.Thread.State: WAITING (on object monitor)
Assuming all methods are normal instance methods, then they will share the same monitor when invoked on the same object. That is, if you had something like:
then in this case, the second thread will be able to call the method, because it's trying to obtain the implicit monitor of the
a2
object, which is not locked by thread 1. But if thread 2 tried to calla1.m2()
, then it would block until thread 1 had finished executingm1()
.If you have static methods, then they obtain the explicit monitor of the class itself (
A.class
in my hypothetical-naming case), so will not be blocked by any instance method invocations.No. Thread t2 will wait for Thread t1 to release the lock. In your same example, t2 can access method m4 which is not synchronized.
Locks In synchronized Methods
Coming back to your second query:
Thread t2 is in blocked state and waiting for Thread t1 to release the lock.
From java documentation page:
making
synchronized
method have two effects.