java - Static synchronized methods and non-synchronized static methods confusion -
i have small confusion. please have @ code below.
public class threaddemo { //non-static synchronized method synchronized void a(){ actbusy(); } //static synchronized method static synchronized void b(){ actbusy(); } //static method static void actbusy(){ try{ thread.sleep(1000); } catch(interruptedexception e) { e.printstacktrace(); } } public static void main(string[] args){ final threaddemo x = new threaddemo(); final threaddemo y = new threaddemo(); runnable runnable = new runnable() { public void run() { int option = (int) (math.random() * 4); switch (option){ case 0: x.a(); break; case 1: x.b(); break; case 2: y.b(); break; case 3: y.b(); break; } } } ; thread t1 = new thread(runnable); thread t2 = new thread(runnable); t1.start(); t2.start(); } }
i know sure invocation of sequence possible.
x.a() //in thread-1 y.b() //in thread-2
though still have small confusion that, can see x.a()
calls actbusy()
method static method. method b()
static synchronized method calling non-synchronized static method. when thread-2 gets class level lock, why call of actbusy()
thread-1 not blocked?
i logically confused, if thread gets class level lock, class other non-synchronized static methods remain open called other methods (instance method). why?
actbusy()
not synchronized callers methods are.
so thread 1 not block acquires lock on this
object , no other thread holds lock on this
, able call without problem.
that because non-static synchronized
method locks on this
present instance , not on class
object.
x.a()
grabs lock on present instance i.e x
, no other thread able enter method a()
of x
until present present thread releases lock.
thread 1 --> x.a()
//acquires lock , holds it
thread 2 ---> x.a() //blocks here until thread 1 releases lock on x
edit:
class object != instance
so according jmm different objects , 2 threads don't interfere each other. allows call it.
edit 2:
why allow calls other static methods? logic behind it?
suppose this:
public static synchronized int statefulmethod(){ //this should protected } public static int nonstatefulmethod(){ //just returns static value such 5 //so thread safe not have state } public static synchronized int otherstatefulmethod(){ //this should thread safe }
so if thread 1 in method statefulmethod()
having shared state protect uses class level lock. thread 2 calls nonstatefulmethod()
should not logically block method thread safe , there no point in making thread block here.
now if thread 3 calls otherstatefulmethod()
while thread 1 holding class lock thread 3 have wait method static-synchornized
.
Comments
Post a Comment