What is the difference between synchronizing a static method and a non static method in java?Can anybody please explain with an example. Also is there any difference in synchronizing a method and synchronizing a block of code?
Static method uses complie time binding or early binding. Non-static method uses run time binding or dynamic binding. A static method cannot be overridden being compile time binding. A non-static method can be overridden being dynamic binding.
Non synchronized -It is not-thread safe and can't be shared between many threads without proper synchronization code. While, Synchronized- It is thread-safe and can be shared with many threads.
static methods can be synchronized. But you have one lock per class.
I will try and add an example to make this extra clear.
As has been mentioned, synchronized in Java is an implementation of the Monitor concept. When you mark a block of code as synchronized you use an object as a parameter. When an executing thread comes to such a block of code, it has to first wait until there is no other executing thread in a synchronized block on that same object.
Object a = new Object(); Object b = new Object(); ... synchronized(a){ doStuff(); } ... synchronized(b){ doSomeStuff(); } ... synchronized(a){ doOtherStuff(); }
In the above example, a thread running doOtherStuff()
would block another thread from entering the block of code protecting doStuff()
. However, a thread could enter the block around doSomeStuff()
without a problem as that is synchronized on Object b
, not Object a
.
When you use the synchronized modifier on an instance method (a non-static method), it is very similar to having a synchronized block with "this" as the argument. So in the following example, methodA()
and methodB()
will act the same way:
public synchronized void methodA() { doStuff(); } ... public void methodB() { synchronized(this) { doStuff(); } }
Note that if you have a methodC()
in that class which is not synchronized and does not have a synchronized block, nothing will stop a thread from entering that method and careless programming could let that thread access non-safe code in the object.
If you have a static method with the synchronized modifier, it is practically the same thing as having a synchronized block with ClassName.class
as the argument (if you have an object of that class, ClassName cn = new ClassName();
, you can access that object with Class c = cn.getClass();
)
class ClassName { public void static synchronized staticMethodA() { doStaticStuff(); } public static void staticMethodB() { synchronized(ClassName.class) { doStaticStuff(); } } public void nonStaticMethodC() { synchronized(this.getClass()) { doStuff(); } } public static void unSafeStaticMethodD() { doStaticStuff(); } }
So in the above example, staticMethodA()
and staticMethodB()
act the same way. An executing thread will also be blocked from accessing the code block in nonStaticMethodC()
as it is synchronizing on the same object.
However, it is important to know that nothing will stop an executing thread from accessing unSafeStaticMethodD()
. Even if we say that a static method "synchronizes on the Class object", it does not mean that it synchronizes all accesses to methods in that class. It simply means that it uses the Class object to synchronize on. Non-safe access is still possible.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With