Why is synchronized block better than synchronized method?

后端 未结 10 975
Happy的楠姐
Happy的楠姐 2020-12-07 08:05

I have started learning synchronization in threading.

Synchronized method:

public class Counter {

   private static int count = 0;

   public stati         


        
10条回答
  •  陌清茗
    陌清茗 (楼主)
    2020-12-07 08:50

    One classic difference between Synchronized block and Synchronized method is that Synchronized method locks the entire object. Synchronized block just locks the code within the block.

    Synchronized method: Basically these 2 sync methods disable multithreading. So one thread completes the method1() and the another thread waits for the Thread1 completion.

    class SyncExerciseWithSyncMethod {

    public synchronized void method1() {
        try {
            System.out.println("In Method 1");
            Thread.sleep(5000);
        } catch (Exception e) {
            System.out.println("Catch of method 1");
        } finally {
            System.out.println("Finally of method 1");
        }
    
    }
    
    public synchronized void method2() {
        try {
            for (int i = 1; i < 10; i++) {
                System.out.println("Method 2 " + i);
                Thread.sleep(1000);
            }
        } catch (Exception e) {
            System.out.println("Catch of method 2");
        } finally {
            System.out.println("Finally of method 2");
        }
    }
    

    }

    Output

    In Method 1

    Finally of method 1

    Method 2 1

    Method 2 2

    Method 2 3

    Method 2 4

    Method 2 5

    Method 2 6

    Method 2 7

    Method 2 8

    Method 2 9

    Finally of method 2


    Synchronized block: Enables multiple threads to access the same object at same time [Enables multi-threading].

    class SyncExerciseWithSyncBlock {

    public Object lock1 = new Object();
    public Object lock2 = new Object();
    
    public void method1() {
        synchronized (lock1) {
            try {
                System.out.println("In Method 1");
                Thread.sleep(5000);
            } catch (Exception e) {
                System.out.println("Catch of method 1");
            } finally {
                System.out.println("Finally of method 1");
            }
        }
    
    }
    
    public void method2() {
    
        synchronized (lock2) {
            try {
                for (int i = 1; i < 10; i++) {
                    System.out.println("Method 2 " + i);
                    Thread.sleep(1000);
                }
            } catch (Exception e) {
                System.out.println("Catch of method 2");
            } finally {
                System.out.println("Finally of method 2");
            }
        }
    }
    

    }

    Output

    In Method 1

    Method 2 1

    Method 2 2

    Method 2 3

    Method 2 4

    Method 2 5

    Finally of method 1

    Method 2 6

    Method 2 7

    Method 2 8

    Method 2 9

    Finally of method 2

提交回复
热议问题