Java多線程synchronized同步方法詳解
1、synchronized 方法與鎖對(duì)象
線程鎖的是對(duì)象。
1)A線程先持有 object 對(duì)象的 Lock 鎖, B線程可以以異步的方式調(diào)用 object 對(duì)象中的非 synchronized 類(lèi)型的方法
2)A線程先持有 object 對(duì)象的 Lock 鎖, B線程如果在這時(shí)調(diào)用 object 對(duì)象中的 synchronized 類(lèi)型的方法,則需要等待,也就是同步。
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(); } } // 因?yàn)?getValue 方法是非 synchronized 方法,所以造成了臟讀 public void getValue() { System.out.println('getValue method thread name = ' + Thread.currentThread().getName() + 'tusername = ' + username + 'tpassword = ' + password); } }}
結(jié)果如圖:
3、synchronized 鎖重入
'可重入鎖'的概念是:
自己可以再次活得自己的內(nèi)部鎖。比如有1條線程獲得了某個(gè)對(duì)象的鎖,此時(shí)這個(gè)對(duì)象鎖還沒(méi)有釋放,當(dāng)其再次想要獲取這個(gè)對(duì)象的鎖的時(shí)候還是可以獲取的,如果不可以鎖重入的話,就會(huì)造成死鎖。
可重入鎖也支持在父子類(lèi)繼承的環(huán)境中:在繼承中,子類(lèi)是完全可以通過(guò)“可重入鎖”調(diào)用父類(lèi)的同步方法的。
4、出現(xiàn)異常,鎖自動(dòng)釋放
線程出現(xiàn)異常,會(huì)釋放當(dāng)前線程的鎖
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. IDEA設(shè)置編碼背景色的方法2. IntelliJ IDEA 刷題利器 LeetCode 插件詳解3. XML解析錯(cuò)誤:未組織好 的解決辦法4. 使用idea搭建springboot initializer服務(wù)器的問(wèn)題分析5. 圖文詳解如何在WordPress中嵌入iFrame6. php + ajax 實(shí)現(xiàn)的寫(xiě)入數(shù)據(jù)庫(kù)操作簡(jiǎn)單示例7. PHP ajax跨子域的解決方案之document.domain+iframe實(shí)例分析8. idea 創(chuàng)建properties配置文件的步驟9. idea自定義快捷鍵的方法步驟10. vue-element-admin中node-sass換成dart-sass,安裝依賴(lài)報(bào)code 128多種問(wèn)題的解決方法
