互斥鎖是JDK6中引入的新特性
使用規則
一、鎖對象設置
a、修飾代碼塊時,需要設置一個引用類型對象作爲鎖的同步監視器對象
b、修飾實例方法時,默認的同步監視器對象是當前對象
c、修飾類方法(靜態方法)時、默認的同步監視器對象是當前類的Class對象
二、根據鎖對象的不同,一把鎖同時最多隻能被一個線程擁有
a、若鎖對象已被當前線程持有,則其他線程需要等待持有鎖的線程釋放鎖後才能繼續執行,否則就阻塞
b、synchronized 添加在方法上時只針對該方法在多線程同步執行時只有一個在運行,其他線程使用對象內的其他沒有添加synchronized 的方法可以正常使用
示例
當 synchronized 鎖住多段不同的代碼片段時,如果這些代碼塊使用的鎖對象是同一個時
那麼這些代碼片段之間就是互斥的,多個線程不能同時執行他們
當 synchronized 添加在方法上時就以當前對象作爲鎖對象,如果是靜態方法則以當前類的Class對象做爲鎖對象
public static synchronized void a() {
System.out.println("a執行中");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static synchronized void b() {
System.out.println("b執行中");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static synchronized void main(String[] args) {
Thread a = new Thread(() -> {
for(int i=0;i<10;i++) {
a();
}
});
Thread b = new Thread(() -> {
for(int i=0;i<10;i++) {
b();
}
});
a.start();
b.start();
}