淺談synchronized方法對(duì)非synchronized方法的影響
StringBuilder是線程不安全的類。
StringBuffer是線程安全的,因?yàn)樗锩娴姆椒恿藄ynchronized。
今天寫了一段代碼測(cè)試了一下:用循環(huán)開啟10個(gè)線程,調(diào)用StringBuffer(StringBuilder)的append追加1 到 10 。
結(jié)果預(yù)期一樣:線程不安全的StringBuilder會(huì)漏掉一些數(shù)字,
public static void main(String[] args) throws InterruptedException {
StringBuffer buffer = new StringBuffer();
StringBuilder builder = new StringBuilder();
// 開啟十個(gè)線程,分別對(duì)buffer 和 builder 操作
for(int i = 0; i < 10; i++) {
int j = i;
new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(500); //造成阻塞
} catch (InterruptedException e) {
e.printStackTrace();
}
builder.append(j);
}
}).start();
}
//等待以上操作完成
Thread.sleep(1000);
// 打印結(jié)果
System.out.println("builder:"+builder);
}

線程安全的StringBuffer則追加了全部10個(gè)數(shù)字:
public static void main(String[] args) throws InterruptedException {
StringBuffer buffer = new StringBuffer();
StringBuilder builder = new StringBuilder();
// 開啟十個(gè)線程,分別對(duì)buffer 和 builder 操作
for(int i = 0; i < 10; i++) {
int j = i;
new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(500); //造成阻塞
} catch (InterruptedException e) {
e.printStackTrace();
}
buffer.append(j);
}
}).start();
}
//等待以上操作完成
Thread.sleep(1000);
// 打印結(jié)果
System.out.println("buffer:"+buffer);
}

這時(shí):如果我同時(shí)操作builder和buffer,且先調(diào)用buffer的append,這時(shí)每次操作因?yàn)閎uilder和buffer在同一個(gè)線程,builder的方法因?yàn)閎uffer阻塞了線程而被變成“同步”的方法,同樣append了10個(gè)數(shù)字
public static void main(String[] args) throws InterruptedException {
StringBuffer buffer = new StringBuffer();
StringBuilder builder = new StringBuilder();
// 開啟十個(gè)線程,分別對(duì)buffer 和 builder 操作
for(int i = 0; i < 10; i++) {
int j = i;
new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(500); //造成阻塞
} catch (InterruptedException e) {
e.printStackTrace();
}
buffer.append(j);
builder.append(j);
}
}).start();
}
//等待以上操作完成
Thread.sleep(1000);
// 打印結(jié)果
System.out.println("buffer:"+buffer);
System.out.println("builder:"+builder);
}

以上這篇淺談synchronized方法對(duì)非synchronized方法的影響就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
通過(guò)jstack分析解決進(jìn)程死鎖問(wèn)題實(shí)例代碼
這篇文章主要介紹了通過(guò)jstack分析解決進(jìn)程死鎖問(wèn)題實(shí)例代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01
MyBatis中select語(yǔ)句中使用String[]數(shù)組作為參數(shù)的操作方法
在 MyBatis 中,如何在 mapper.xml 配置文件中 select 語(yǔ)句中使用 String[] 數(shù)組作為參數(shù)呢,并且使用IN關(guān)鍵字來(lái)匹配數(shù)據(jù)庫(kù)中的記錄,這篇文章主要介紹了MyBatis中select語(yǔ)句中使用String[]數(shù)組作為參數(shù),需要的朋友可以參考下2023-12-12
Java操作Mongodb數(shù)據(jù)庫(kù)實(shí)現(xiàn)數(shù)據(jù)的增刪查改功能示例
這篇文章主要介紹了Java操作Mongodb數(shù)據(jù)庫(kù)實(shí)現(xiàn)數(shù)據(jù)的增刪查改功能,結(jié)合完整實(shí)例形式分析了java針對(duì)MongoDB數(shù)據(jù)庫(kù)的連接、增刪改查等相關(guān)操作技巧,需要的朋友可以參考下2017-08-08
Java實(shí)現(xiàn)發(fā)送郵件并攜帶附件
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)發(fā)送郵件并攜帶附件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
Spring?Security?基于URL的權(quán)限判斷源碼解析
這篇文章主要介紹了Spring?Security?基于URL的權(quán)限判斷問(wèn)題,我們想要實(shí)現(xiàn)自己的基于請(qǐng)求Url的授權(quán)只需自定義一個(gè)?AccessDecisionManager即可,接下來(lái)跟隨小編一起看看實(shí)現(xiàn)代碼吧2021-12-12
MyBatis-Plus中最簡(jiǎn)單的查詢操作教程(Lambda)
這篇文章主要給大家介紹了關(guān)于MyBatis-Plus中最簡(jiǎn)單的查詢操作的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-03-03
SpringBoot啟動(dòng)后自動(dòng)執(zhí)行初始化任務(wù)的五種方法
在 Spring Boot 開發(fā)中,我們經(jīng)常需要在應(yīng)用啟動(dòng)后立即執(zhí)行初始化任務(wù),本文將深度解析 ??5 種主流實(shí)現(xiàn)方案??,大家可以根據(jù)自己的需求自行選擇2025-04-04

