首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 多線程環境與單線程環境:StringBuffer vs StringBuilder 線程安全本質

     編輯:程式設計綜合問答

定義對比

維度單線程環境多線程環境
執行流僅主線程主線程 + 多個工作線程並發
共享數據無競爭多線程可同時讀寫同一變量
典型場景簡單控制台程序、單線程批處理Web 容器 (Tomcat/Jetty)、GUI 事件循環、Netty 服務端
安全要求無需同步必須同步/不可變/線程封閉

Web 項目中的 Action/Controller 是多線程環境

Spring MVC / Struts2 / Servlet API 中:

  • Controller Bean 默認單例:全應用僅一個實例服務所有請求。
  • 每個請求一個線程:Tomcat 線程池分發請求,併發調用同一 Controller 實例方法。
  • 實例變量 = 共享變量:若 Controller 定義 private List buffer;,併發請求會導致數據競爭。

StringBuffer vs StringBuilder 實現差異

// StringBuffer (JDK 1.0) - 所有公共方法 synchronized
public synchronized int length() { return count; }
public synchronized StringBuffer append(String str) { ... }

// StringBuilder (JDK 5.0) - 無同步
public int length() { return count; }
public StringBuilder append(String str) { ... }

性能對比 (單線程基準測試)

// 1000 萬次 append
StringBuffer: ~450 ms
StringBuilder: ~120 ms  // 快 3-4 倍

選擇指南

  1. 局部變量、方法內構建字符串 → **StringBuilder** (無共享、無同步開銷)。
  2. 實例/靜態變量、多線程共享** → **StringBuffer** 或 **ThreadLocal** 或手動 synchronized。
  3. 高併發日誌/緩衝區** → 考慮 java.util.concurrent 無鎖隊列 + 批量寫入。

Java Web 開發最佳實踐

@RestController
public class UserController {
    // 正確:局部變量用 StringBuilder
    @GetMapping("/export")
    public String export() {
        StringBuilder sb = new StringBuilder(); // 線程封閉,安全高效
        userService.findAll().forEach(u -> sb.append(u.getName()).append('\n'));
        return sb.toString();
    }

    // 錯誤:實例變量 StringBuilder 共享
    // private StringBuilder cache = new StringBuilder(); // 併發亂序/丟數據

    // 正確:共享緩衝用 StringBuffer 或線程安全集合
    private final StringBuffer sharedLog = new StringBuffer(); // 簡單場景可用
}

擴展:其他非線程安全類

非線程安全線程安全對應備註
ArrayListVector / Collections.synchronizedList / CopyOnWriteArrayList
HashMapHashtable / Collections.synchronizedMap / ConcurrentHashMap推薦 ConcurrentHashMap
SimpleDateFormatThreadLocal / DateTimeFormatter (JDK8+ 不可變)SimpleDateFormat 極易併發錯誤

總結

**環境決定選擇**:單線程/線程封閉用高性能非同步類;多線程共享用同步類或並發包。Web Controller 實例變量屬於多線程共享,**切勿用 StringBuilder/ArrayList/HashMap 作為實例字段**。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved