What does 'synchronized' mean?

后端 未结 17 1646
广开言路
广开言路 2020-11-22 00:13

I have some questions regarding the usage and significance of the synchronized keyword.

  • What is the significance of the synchronized
17条回答
  •  后悔当初
    2020-11-22 00:43

    Well, I think we had enough of theoretical explanations, so consider this code

    public class SOP {
        public static void print(String s) {
            System.out.println(s+"\n");
        }
    }
    
    public class TestThread extends Thread {
        String name;
        TheDemo theDemo;
        public TestThread(String name,TheDemo theDemo) {
            this.theDemo = theDemo;
            this.name = name;
            start();
        }
        @Override
        public void run() {
            theDemo.test(name);
        }
    }
    
    public class TheDemo {
        public synchronized void test(String name) {
            for(int i=0;i<10;i++) {
                SOP.print(name + " :: "+i);
                try{
                    Thread.sleep(500);
                } catch (Exception e) {
                    SOP.print(e.getMessage());
                }
            }
        }
        public static void main(String[] args) {
            TheDemo theDemo = new TheDemo();
            new TestThread("THREAD 1",theDemo);
            new TestThread("THREAD 2",theDemo);
            new TestThread("THREAD 3",theDemo);
        }
    }
    

    Note: synchronized blocks the next thread's call to method test() as long as the previous thread's execution is not finished. Threads can access this method one at a time. Without synchronized all threads can access this method simultaneously.

    When a thread calls the synchronized method 'test' of the object (here object is an instance of 'TheDemo' class) it acquires the lock of that object, any new thread cannot call ANY synchronized method of the same object as long as previous thread which had acquired the lock does not release the lock.

    Similar thing happens when any static synchronized method of the class is called. The thread acquires the lock associated with the class(in this case any non static synchronized method of an instance of that class can be called by any thread because that object level lock is still available). Any other thread will not be able to call any static synchronized method of the class as long as the class level lock is not released by the thread which currently holds the lock.

    Output with synchronised

    THREAD 1 :: 0
    THREAD 1 :: 1
    THREAD 1 :: 2
    THREAD 1 :: 3
    THREAD 1 :: 4
    THREAD 1 :: 5
    THREAD 1 :: 6
    THREAD 1 :: 7
    THREAD 1 :: 8
    THREAD 1 :: 9
    THREAD 3 :: 0
    THREAD 3 :: 1
    THREAD 3 :: 2
    THREAD 3 :: 3
    THREAD 3 :: 4
    THREAD 3 :: 5
    THREAD 3 :: 6
    THREAD 3 :: 7
    THREAD 3 :: 8
    THREAD 3 :: 9
    THREAD 2 :: 0
    THREAD 2 :: 1
    THREAD 2 :: 2
    THREAD 2 :: 3
    THREAD 2 :: 4
    THREAD 2 :: 5
    THREAD 2 :: 6
    THREAD 2 :: 7
    THREAD 2 :: 8
    THREAD 2 :: 9
    

    Output without synchronized

    THREAD 1 :: 0
    THREAD 2 :: 0
    THREAD 3 :: 0
    THREAD 1 :: 1
    THREAD 2 :: 1
    THREAD 3 :: 1
    THREAD 1 :: 2
    THREAD 2 :: 2
    THREAD 3 :: 2
    THREAD 1 :: 3
    THREAD 2 :: 3
    THREAD 3 :: 3
    THREAD 1 :: 4
    THREAD 2 :: 4
    THREAD 3 :: 4
    THREAD 1 :: 5
    THREAD 2 :: 5
    THREAD 3 :: 5
    THREAD 1 :: 6
    THREAD 2 :: 6
    THREAD 3 :: 6
    THREAD 1 :: 7
    THREAD 2 :: 7
    THREAD 3 :: 7
    THREAD 1 :: 8
    THREAD 2 :: 8
    THREAD 3 :: 8
    THREAD 1 :: 9
    THREAD 2 :: 9
    THREAD 3 :: 9
    

提交回复
热议问题