1. 程式人生 > >sychronized修飾方法鎖的是物件?還是類所有的物件?

sychronized修飾方法鎖的是物件?還是類所有的物件?

1、如果sychronized修飾的不是類的靜態方法,鎖的是呼叫的物件:

程式碼如下:

執行緒執行類:

public class SynchronizedApp extends Thread {

    public synchronized  void testAMethod() {
        System.out.println("start methodA----------" + currentThread().getName());
    }

    public synchronized  void testBMethod() {
        System.out.println("start methodB----------" + currentThread().getName());
    }

    public void run() {
        testAMethod();
        testBMethod();

    }

}

執行緒測試類:

public class Test {
    public static void main(String[] args) {

        int i = 0;

        while (true) {

            SynchronizedApp test = new SynchronizedApp();
            test.setName("SynchronizedApp" + i);
            i++;
            test.start();

        }

    }

}

測試結果:

2、如果sychronized修飾的不是類的靜態方法,鎖的是類,類的每一個物件都要按照順序呼叫testAMethod--testBMethod

程式碼如下:

執行緒執行類:

public class SynchronizedApp extends Thread {

    public synchronized static void testAMethod() {
        System.out.println("start methodA----------" + currentThread().getName());
    }

    public synchronized static void testBMethod() {
        System.out.println("start methodB----------" + currentThread().getName());
    }

    public void run() {
        testAMethod();
        testBMethod();

    }

}

執行緒測試類:

public class Test {
    public static void main(String[] args) {

        int i = 0;

        while (true) {

            SynchronizedApp test = new SynchronizedApp();
            test.setName("SynchronizedApp" + i);
            i++;
            test.start();

        }

    }

}

測試結果:物件的執行順序進行