sychronized修飾方法鎖的是物件?還是類所有的物件?
阿新 • • 發佈:2018-10-31
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();
}
}
}
測試結果:物件的執行順序進行