I created two threads and using a single instance of class called the static and non-static methods of that object. Ideally static methods need to be called using the class name and i did that too.
I synchronized both the static and non-static methods on a private static member of the class whose methods the threads are calling. I noticed that the output was synchronized!
My questions are:
Static methods if synchronized using a synchronized block it usually requires the class instance, then how did it accept a static object!
How was the output synchronized as threads calling static methods acquire the class level lock and threads calling non-static methods acquire object level lock!
Even though i have used synchronized block in both the static and non-static methods based on an object, it really shouldn't synchronize; or is it special case with synchronized blocks on static objects?
Please let me know.
Following is the code i have written:
public class StaticNonStaticSynch { public static void main(String[] args) { final StaticNonStaticTest staticNonStaticTest = new StaticNonStaticTest(); Runnable runnable1 = new Runnable() { @Override public void run() { staticNonStaticTest.nonStaticMethod(); } }; Runnable runnable2 = new Runnable() { @Override public void run() { staticNonStaticTest.staticMethod(); } }; Thread thread1 = new Thread(runnable1, "First Thread"); Thread thread2 = new Thread(runnable2, "Second Thread"); thread1.start(); thread2.start(); } } class StaticNonStaticTest { private static Object object = new Object(); void nonStaticMethod() { synchronized (object) { for(int i=0;i<500;i++) { System.out.println("Non - Static method called by " + Thread.currentThread().getName() +" : = "+i); } } } static void staticMethod() { synchronized (object) { for(int i=0;i<500;i++) { System.out.println("Static method called by " + Thread.currentThread().getName() +" : = "+i); } } } }