淺談synchronized方法對(duì)非synchronized方法的影響
StringBuilder是線程不安全的類。
StringBuffer是線程安全的,因?yàn)樗锩娴姆椒恿藄ynchronized。
今天寫(xiě)了一段代碼測(cè)試了一下:用循環(huán)開(kāi)啟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();
// 開(kāi)啟十個(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();
// 開(kāi)啟十個(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();
// 開(kāi)啟十個(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)文章
jmeter下載及安裝配置教程(win10平臺(tái)為例)
Apache?JMeter是Apache組織開(kāi)發(fā)的基于Java的壓力測(cè)試工具,Apache?jmeter?可以用于對(duì)靜態(tài)的和動(dòng)態(tài)的資源(文件,Servlet,Perl腳本,java?對(duì)象,數(shù)據(jù)庫(kù)和查詢,F(xiàn)TP服務(wù)器等等)的性能進(jìn)行測(cè)試,本文給大家介紹jmeter下載及安裝配置過(guò)程,感興趣的朋友一起看看吧2021-12-12
IntelliJ IDEA設(shè)置顯示內(nèi)存指示器和設(shè)置內(nèi)存大小的方法
這篇文章主要介紹了IntelliJ IDEA設(shè)置顯示內(nèi)存指示器和設(shè)置內(nèi)存大小的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04
Java使用HashMap映射實(shí)現(xiàn)消費(fèi)抽獎(jiǎng)功能
這篇文章主要為大家詳細(xì)介紹了Java使用HashMap映射實(shí)現(xiàn)消費(fèi)抽獎(jiǎng)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
IDEA常量字符串過(guò)長(zhǎng)問(wèn)題及解決方案
在編譯Java項(xiàng)目時(shí)遇到“常量字符串過(guò)長(zhǎng)”錯(cuò)誤,可以通過(guò)修改編譯器設(shè)置解決,具體方法是進(jìn)入IDE的設(shè)置(File>>Settings>>Build, Execution, Deployment>>Compiler>>Java Compiler),將使用的編譯器更改為Eclipse,如果問(wèn)題依舊2024-10-10
SpringCloudAlibaba Nacos開(kāi)啟鑒權(quán)解決跳過(guò)登錄頁(yè)面問(wèn)題
對(duì)于Nacos,如果需要開(kāi)啟權(quán)限控制,可以在 Nacos 控制臺(tái)上進(jìn)行配置,本文主要介紹了SpringCloudAlibaba Nacos開(kāi)啟鑒權(quán)解決跳過(guò)登錄頁(yè)面問(wèn)題,感興趣的可以了解一下2023-10-10
線程池滿Thread?pool?exhausted排查和解決方案
這篇文章主要介紹了線程池滿Thread?pool?exhausted排查和解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
ActiveMQ基于zookeeper的主從(levelDB Master/Slave)搭建
這篇文章主要介紹了ActiveMQ基于zookeeper的主從levelDB Master/Slave搭建,以及Spring-boot下的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
spring mybatis多數(shù)據(jù)源實(shí)例詳解
本文主要介紹sping mybatis多數(shù)據(jù)源處理,在開(kāi)發(fā)過(guò)程中經(jīng)常會(huì)遇到多個(gè)數(shù)據(jù)庫(kù),這里給大家舉例說(shuō)明如何處理,希望能幫助有需要的小伙伴2016-07-07

