淺談synchronized方法對非synchronized方法的影響
StringBuilder是線程不安全的類。
StringBuffer是線程安全的,因?yàn)樗锩娴姆椒恿藄ynchronized。
今天寫了一段代碼測試了一下:用循環(huán)開啟10個線程,調(diào)用StringBuffer(StringBuilder)的append追加1 到 10 。
結(jié)果預(yù)期一樣:線程不安全的StringBuilder會漏掉一些數(shù)字,
public static void main(String[] args) throws InterruptedException {
StringBuffer buffer = new StringBuffer();
StringBuilder builder = new StringBuilder();
// 開啟十個線程,分別對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個數(shù)字:
public static void main(String[] args) throws InterruptedException {
StringBuffer buffer = new StringBuffer();
StringBuilder builder = new StringBuilder();
// 開啟十個線程,分別對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);
}

這時:如果我同時操作builder和buffer,且先調(diào)用buffer的append,這時每次操作因?yàn)閎uilder和buffer在同一個線程,builder的方法因?yàn)閎uffer阻塞了線程而被變成“同步”的方法,同樣append了10個數(shù)字
public static void main(String[] args) throws InterruptedException {
StringBuffer buffer = new StringBuffer();
StringBuilder builder = new StringBuilder();
// 開啟十個線程,分別對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方法對非synchronized方法的影響就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
通過jstack分析解決進(jìn)程死鎖問題實(shí)例代碼
這篇文章主要介紹了通過jstack分析解決進(jìn)程死鎖問題實(shí)例代碼,具有一定借鑒價值,需要的朋友可以參考下2018-01-01
MyBatis中select語句中使用String[]數(shù)組作為參數(shù)的操作方法
在 MyBatis 中,如何在 mapper.xml 配置文件中 select 語句中使用 String[] 數(shù)組作為參數(shù)呢,并且使用IN關(guān)鍵字來匹配數(shù)據(jù)庫中的記錄,這篇文章主要介紹了MyBatis中select語句中使用String[]數(shù)組作為參數(shù),需要的朋友可以參考下2023-12-12
Java操作Mongodb數(shù)據(jù)庫實(shí)現(xiàn)數(shù)據(jù)的增刪查改功能示例
這篇文章主要介紹了Java操作Mongodb數(shù)據(jù)庫實(shí)現(xiàn)數(shù)據(jù)的增刪查改功能,結(jié)合完整實(shí)例形式分析了java針對MongoDB數(shù)據(jù)庫的連接、增刪改查等相關(guān)操作技巧,需要的朋友可以參考下2017-08-08
Java實(shí)現(xiàn)發(fā)送郵件并攜帶附件
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)發(fā)送郵件并攜帶附件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09
Spring?Security?基于URL的權(quán)限判斷源碼解析
這篇文章主要介紹了Spring?Security?基于URL的權(quán)限判斷問題,我們想要實(shí)現(xiàn)自己的基于請求Url的授權(quán)只需自定義一個?AccessDecisionManager即可,接下來跟隨小編一起看看實(shí)現(xiàn)代碼吧2021-12-12
MyBatis-Plus中最簡單的查詢操作教程(Lambda)
這篇文章主要給大家介紹了關(guān)于MyBatis-Plus中最簡單的查詢操作的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2022-03-03
SpringBoot啟動后自動執(zhí)行初始化任務(wù)的五種方法
在 Spring Boot 開發(fā)中,我們經(jīng)常需要在應(yīng)用啟動后立即執(zhí)行初始化任務(wù),本文將深度解析 ??5 種主流實(shí)現(xiàn)方案??,大家可以根據(jù)自己的需求自行選擇2025-04-04

