Java多線程synchronized同步方法詳解
1、synchronized 方法與鎖對(duì)象
線程鎖的是對(duì)象。
1)A線程先持有 object 對(duì)象的 Lock 鎖, B線程可以以異步的方式調(diào)用 object 對(duì)象中的非 synchronized 類型的方法
2)A線程先持有 object 對(duì)象的 Lock 鎖, B線程如果在這時(shí)調(diào)用 object 對(duì)象中的 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();
}
}
// 因?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ì)造成死鎖。
可重入鎖也支持在父子類繼承的環(huán)境中:在繼承中,子類是完全可以通過(guò)“可重入鎖”調(diào)用父類的同步方法的。
4、出現(xiàn)異常,鎖自動(dòng)釋放
線程出現(xiàn)異常,會(huì)釋放當(dāng)前線程的鎖
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解SpringBoot如何自定義一個(gè)Starter
小伙伴們?cè)?jīng)可能都經(jīng)歷過(guò)整天寫(xiě)著CURD的業(yè)務(wù),都沒(méi)寫(xiě)過(guò)一些組件相關(guān)的東西,這篇文章記錄一下SpringBoot如何自定義一個(gè)Starter。原理和理論就不用多說(shuō)了,可以在網(wǎng)上找到很多關(guān)于該方面的資料,這里主要分享如何自定義2022-11-11
SpringBoot整合Swagger3生成接口文檔的示例代碼
Swagger 是一個(gè) RESTful API 的開(kāi)源框架,它的主要目的是幫助開(kāi)發(fā)者設(shè)計(jì)、構(gòu)建、文檔化和測(cè)試 Web API,本文給大家介紹了SpringBoot整合Swagger3生成接口文檔的流程,并通過(guò)代碼講解的非常詳細(xì),需要的朋友可以參考下2024-04-04
關(guān)于springboot 配置date字段返回時(shí)間戳的問(wèn)題
這篇文章主要介紹了springboot 配置date字段返回時(shí)間戳的問(wèn)題,在springboot2.0后,spring會(huì)將Date字段自動(dòng)給轉(zhuǎn)成UTC字符串了(在沒(méi)有配置的情況下),所以date需要轉(zhuǎn)換成時(shí)間戳還是yyyy-MM-dd HH:mm:ss,具體解決方法跟隨小編一起看看吧2021-07-07
Gitlab CI-CD自動(dòng)化部署SpringBoot項(xiàng)目的方法步驟
本文主要記錄如何通過(guò)Gitlab CI/CD自動(dòng)部署SpringBoot項(xiàng)目jar包。文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-07-07

