StringBuilder是執行緒不安全的類別。
StringBuffer是線程安全的,因為它裡面的方法加了synchronized。
今天寫了一段程式碼測試了一下:用迴圈開啟10個線程,呼叫StringBuffer(StringBuilder)的append追加1 到 10 。
結果預期一樣:線程不安全的StringBuilder會漏掉一些數字,
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個數字:
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,且先呼叫buffer的append,這時每次操作因為builder和buffer在同一個線程,builder的方法因為buffer阻塞了線程而被變成「同步」的方法,同樣append了10個數字
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方法有哪些影響的詳細內容。更多資訊請關注PHP中文網其他相關文章!