| 維度 | 單線程環境 | 多線程環境 |
|---|---|---|
| 執行流 | 僅主線程 | 主線程 + 多個工作線程並發 |
| 共享數據 | 無競爭 | 多線程可同時讀寫同一變量 |
| 典型場景 | 簡單控制台程序、單線程批處理 | Web 容器 (Tomcat/Jetty)、GUI 事件循環、Netty 服務端 |
| 安全要求 | 無需同步 | 必須同步/不可變/線程封閉 |
Spring MVC / Struts2 / Servlet API 中:
private List buffer; ,併發請求會導致數據競爭。// 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 倍
synchronized。java.util.concurrent 無鎖隊列 + 批量寫入。@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(); // 簡單場景可用
}
| 非線程安全 | 線程安全對應 | 備註 |
|---|---|---|
| ArrayList | Vector / Collections.synchronizedList / CopyOnWriteArrayList | |
| HashMap | Hashtable / Collections.synchronizedMap / ConcurrentHashMap | 推薦 ConcurrentHashMap |
| SimpleDateFormat | ThreadLocal | SimpleDateFormat 極易併發錯誤 |
**環境決定選擇**:單線程/線程封閉用高性能非同步類;多線程共享用同步類或並發包。Web Controller 實例變量屬於多線程共享,**切勿用 StringBuilder/ArrayList/HashMap 作為實例字段**。