淺談synchronized方法對非synchronized方法的影響
StringBuilder是線程不安全的類。
StringBuffer是線程安全的,因?yàn)樗锩娴姆椒恿藄ynchronized。
今天寫了一段代碼測試了一下:用循環(huán)開啟10個(gè)線程,調(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(); // 開啟十個(gè)線程,分別對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è)線程,分別對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è)線程,分別對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)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
IntelliJ IDEA設(shè)置顯示內(nèi)存指示器和設(shè)置內(nèi)存大小的方法
這篇文章主要介紹了IntelliJ IDEA設(shè)置顯示內(nèi)存指示器和設(shè)置內(nèi)存大小的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04Java使用HashMap映射實(shí)現(xiàn)消費(fèi)抽獎(jiǎng)功能
這篇文章主要為大家詳細(xì)介紹了Java使用HashMap映射實(shí)現(xiàn)消費(fèi)抽獎(jiǎng)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09SpringCloudAlibaba Nacos開啟鑒權(quán)解決跳過登錄頁面問題
對于Nacos,如果需要開啟權(quán)限控制,可以在 Nacos 控制臺上進(jìn)行配置,本文主要介紹了SpringCloudAlibaba Nacos開啟鑒權(quán)解決跳過登錄頁面問題,感興趣的可以了解一下2023-10-10線程池滿Thread?pool?exhausted排查和解決方案
這篇文章主要介紹了線程池滿Thread?pool?exhausted排查和解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11ActiveMQ基于zookeeper的主從(levelDB Master/Slave)搭建
這篇文章主要介紹了ActiveMQ基于zookeeper的主從levelDB Master/Slave搭建,以及Spring-boot下的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08spring mybatis多數(shù)據(jù)源實(shí)例詳解
本文主要介紹sping mybatis多數(shù)據(jù)源處理,在開發(fā)過程中經(jīng)常會遇到多個(gè)數(shù)據(jù)庫,這里給大家舉例說明如何處理,希望能幫助有需要的小伙伴2016-07-07