Synchronized block and synchronized methods are two techniques to create mutual exclusion on crucial parts of code in Java using synchronized keywords. Since Java is mainly useful to write multi-threading programs, which present various kinds of thread-related issues like thread-safety, deadlock, and race conditions. It plagues into code mainly because of poor understanding of the synchronization mechanism provided by the Java programming language. To implement synchronization in Java, the language includes built-in synchronized and volatile keywords.
The key distinction between the synchronized technique and the synchronized block is that the synchronized method uses a different set of locks to lock the vital region.
A synchronized method that depends on whether it’s a static or non-static lock on the class level or object level.
Each class has its own lock, which is represented by a class literal, such as Stirng.class.
A current object, such as this instance, provides the object-level lock. In Java, you should never mix static and non-static synchronized methods.
Synchronized blocks, on the other hand, lock on the monitor based on the expression provided as an input to the synchronized block.
We’ll look at an example of both a synchronized method and a synchronized block in the next section.
Difference between synchronized method vs block in Java
Based on experience and syntactical rules of the synchronized keyword in Java, here are some more differences between synchronized method and block in Java.
Although both blocks and methods can be used to offer the highest level of synchronization in Java, synchronized blocks are considered to be a better Java coding practice.
1. Scope of lock
Because the scope of a lock is inversely related to performance, locking only a critical area of code is always preferable.
Double-checked locking in the Singleton pattern, where instead of locking the entire getInstance() method, we only lock the critical portion of code. It is necessary to generate the Singleton instance.
Synchronized blocks provide you finer control over a lock. They allow you to use any lock to enable mutual exclusion to critical section code.
The synchronized method, on the other hand, always locks on the current object indicated by this keyword. Or if it’s a static synchronized function, on the class level lock.
In the synchronized block, on the other hand, the thread acquires a lock when they join it and releases it when they exit it.
To understand more about monitor, lock, and concurrency, take a look at these Java Multithreading and Concurrency classes.
Synchronized method vs synchronized block Example in Java
Here is an example of a sample class that shows on which object synchronized method and block are locked and how to use them : /** * Java class to demonstrate the use of synchronization method and block in Java */ public class SycnronizationExample{ public synchronized void lockedByThis(){ System.out.println(" This synchronized method is locked by current" instance of object i.e. this"); } public static synchronized void lockedByClassLock(){ System.out.println("This static synchronized method is locked by class level lock of this class i.e. SychronizationExample.class"); } public void lockedBySynchronizedBlock(){ System.err.println("This line is executed without locking"); Object obj = String.class; //class level lock of Stirng class synchronized(obj){ System.out.println("synchronized block, locked by lock represented using obj variable"); } } }
That’s all there is to know about the distinction between a synchronized method and a block in Java.
One of the Java best practices to follow is to choose synchronized blocks over methods. Since it lowers the scope of the lock and increases speed.
On the other hand, while utilizing the synchronized method is simple, mixing non-static and static synchronized methods might cause problems because they are locked on different monitors. And if you use them to synchronize access to a shared resource, it will almost certainly break.