When you will synchronize a piece of your code

?– When you expect your code will be accessed by different threads and these threads may change a particular data causing data corruption.

In Java, synchronization is used to control access to shared resources or critical sections of code by multiple threads. When you synchronize a piece of your code, it means that you are ensuring that only one thread can execute that piece of code at a time. This is typically achieved using the synchronized keyword.

There are two ways to synchronize code in Java:

  1. Synchronized Methods: You can declare a method as synchronized by using the synchronized keyword in the method signature. When a thread invokes a synchronized method, it automatically acquires the lock for that method’s object, preventing other threads from entering the same synchronized method.
    java
    public synchronized void synchronizedMethod() {
    // Synchronized code block
    // Only one thread can execute this method at a time
    }
  2. Synchronized Blocks: You can use synchronized blocks to explicitly define a critical section of code. This is done by specifying an object on which the lock will be acquired. Only one thread can hold the lock on that object at a time.
    java
    Object lockObject = new Object();

    // ...

    synchronized (lockObject) {
    // Synchronized code block
    // Only one thread can execute this block at a time
    }

The correct choice between synchronized methods and synchronized blocks depends on your specific use case and requirements. It’s essential to be cautious while using synchronization to avoid potential issues like deadlocks and reduced performance due to contention for locks. Additionally, with the introduction of the java.util.concurrent package, alternative mechanisms such as ReentrantLock and Semaphore are available for more fine-grained control over concurrency.