StringBuilder是線程不安全的類。
我們擁有10余年網(wǎng)頁設計和網(wǎng)站建設經(jīng)驗,從網(wǎng)站策劃到網(wǎng)站制作,我們的網(wǎng)頁設計師為您提供的解決方案。為企業(yè)提供網(wǎng)站制作、成都網(wǎng)站建設、微信開發(fā)、微信小程序開發(fā)、手機網(wǎng)站開發(fā)、H5技術、等業(yè)務。無論您有什么樣的網(wǎng)站設計或者設計方案要求,我們都將富于創(chuàng)造性的提供專業(yè)設計服務并滿足您的需求。
StringBuffer是線程安全的,因為它里面的方法加了synchronized。
今天寫了一段代碼測試了一下:用循環(huán)開啟10個線程,調(diào)用StringBuffer(StringBuilder)的append追加1 到 10 。
結果預期一樣:線程不安全的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); // 打印結果 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); // 打印結果 System.out.println("buffer:"+buffer); }
這時:如果我同時操作builder和buffer,且先調(diào)用buffer的append,這時每次操作因為builder和buffer在同一個線程,builder的方法因為buffer阻塞了線程而被變成“同步”的方法,同樣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); // 打印結果 System.out.println("buffer:"+buffer); System.out.println("builder:"+builder); }
以上這篇淺談synchronized方法對非synchronized方法的影響就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持創(chuàng)新互聯(lián)。