Java多線程synchronized同步方法詳解
1、synchronized 方法與鎖對象
線程鎖的是對象。
1)A線程先持有 object 對象的 Lock 鎖, B線程可以以異步的方式調(diào)用 object 對象中的非 synchronized 類型的方法
2)A線程先持有 object 對象的 Lock 鎖, B線程如果在這時調(diào)用 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); } } }
結(jié)果如圖:
3、synchronized 鎖重入
"可重入鎖"的概念是:
自己可以再次活得自己的內(nèi)部鎖。比如有1條線程獲得了某個對象的鎖,此時這個對象鎖還沒有釋放,當其再次想要獲取這個對象的鎖的時候還是可以獲取的,如果不可以鎖重入的話,就會造成死鎖。
可重入鎖也支持在父子類繼承的環(huán)境中:在繼承中,子類是完全可以通過“可重入鎖”調(diào)用父類的同步方法的。
4、出現(xiàn)異常,鎖自動釋放
線程出現(xiàn)異常,會釋放當前線程的鎖
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot整合Swagger3生成接口文檔的示例代碼
Swagger 是一個 RESTful API 的開源框架,它的主要目的是幫助開發(fā)者設(shè)計、構(gòu)建、文檔化和測試 Web API,本文給大家介紹了SpringBoot整合Swagger3生成接口文檔的流程,并通過代碼講解的非常詳細,需要的朋友可以參考下2024-04-04關(guān)于springboot 配置date字段返回時間戳的問題
這篇文章主要介紹了springboot 配置date字段返回時間戳的問題,在springboot2.0后,spring會將Date字段自動給轉(zhuǎn)成UTC字符串了(在沒有配置的情況下),所以date需要轉(zhuǎn)換成時間戳還是yyyy-MM-dd HH:mm:ss,具體解決方法跟隨小編一起看看吧2021-07-07Gitlab CI-CD自動化部署SpringBoot項目的方法步驟
本文主要記錄如何通過Gitlab CI/CD自動部署SpringBoot項目jar包。文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧2021-07-07