Java多線程synchronized同步方法詳解
1、synchronized 方法與鎖對象
線程鎖的是對象。
1)A線程先持有 object 對象的 Lock 鎖, B線程可以以異步的方式調用 object 對象中的非 synchronized 類型的方法
2)A線程先持有 object 對象的 Lock 鎖, B線程如果在這時調用 object 對象中的 synchronized 類型的方法,則需要等待,也就是同步。
2、臟讀(DirtyRead)
示例:
public class DirtyReadTest {
public static void main(String[] args) {
try {
PublicVar publicVar = new PublicVar();
ThreadA thread = new ThreadA(publicVar);
thread.start();
Thread.sleep(200);
publicVar.getValue();
} catch (Exception e) {
e.printStackTrace();
}
}
static class ThreadA extends Thread {
private PublicVar publicVar;
public ThreadA(PublicVar publicVar) {
this.publicVar = publicVar;
}
@Override
public void run() {
super.run();
publicVar.setValue("B", "BB");
}
}
static class PublicVar {
public String username = "A";
public String password = "AA";
synchronized public void setValue(String username, String password) {
try {
this.username = username;
Thread.sleep(1000);
this.password = password;
System.out.println("setValue method thread name = " + Thread.currentThread().getName() + "\tusername = " + username + "\tpassword = " + password);
} catch (Exception e) {
e.printStackTrace();
}
}
// 因為 getValue 方法是非 synchronized 方法,所以造成了臟讀
public void getValue() {
System.out.println("getValue method thread name = " + Thread.currentThread().getName() + "\tusername = " + username + "\tpassword = " + password);
}
}
}
結果如圖:

3、synchronized 鎖重入
"可重入鎖"的概念是:
自己可以再次活得自己的內部鎖。比如有1條線程獲得了某個對象的鎖,此時這個對象鎖還沒有釋放,當其再次想要獲取這個對象的鎖的時候還是可以獲取的,如果不可以鎖重入的話,就會造成死鎖。
可重入鎖也支持在父子類繼承的環(huán)境中:在繼承中,子類是完全可以通過“可重入鎖”調用父類的同步方法的。
4、出現(xiàn)異常,鎖自動釋放
線程出現(xiàn)異常,會釋放當前線程的鎖
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
淺談hibernate急迫加載問題(多重外鍵關聯(lián))
這篇文章主要介紹了淺談hibernate急迫加載問題(多重外鍵關聯(lián)),具有一定借鑒價值,需要的朋友可以參考下。2017-12-12
springboot?bootstrap.yml?nacos配置中心問題
這篇文章主要介紹了springboot?bootstrap.yml?nacos配置中心問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03
springcloud項目快速開始起始模板的實現(xiàn)
本文主要介紹了springcloud項目快速開始起始模板思路的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12

