问题这是一个蓝牙数据采集系统蓝牙设备每秒钟发送大量传感器数据PPG、加速度计、温度等每行数据包含60个字段长度约500字符使用生产者-消费者模式异步写入CSV文件写入频率极高队列高速消费使用new StringBuilder(256)会导致数据丢失而使用new StringBuilder()反而一切正常原因初始化容量不足 自动扩容时的并发 / 异步安全问题遇到的现象new StringBuilder(256) → 数据丢失new StringBuilder()默认容量 16→ 正常这不是 “容量越小越安全”而是256 这个固定容量刚好触发了致命缺陷默认容量反而因为扩容逻辑不同避开了坑。1.的单条数据长度 ≈ 500 字符设置初始容量 256实际要写入 500 字符StringBuilder 必须自动扩容2. 高频异步 / 多线程下自动扩容 数据丢失的根源StringBuilder 不是线程安全类当容量不足触发自动扩容时底层会创建新的 char 数组把旧数据复制过去替换引用在高并发写入下这个过程会出现线程 A 正在扩容复制数据线程 B 同时写入新字符最终部分数据被覆盖、截断、丢失为什么 new StringBuilder(256) 必丢new StringBuilder() 反而正常关键区别扩容触发时机 扩容次数① new StringBuilder(256)危险初始容量256数据500 字符只需要扩容 1 次就能装下扩容刚好发生在写入最密集、并发最高的时刻→ 扩容冲突概率 100% → 必丢数据② new StringBuilder()默认 16安全初始容量16写入 500 字符需要 连续扩容 N 次16→32→64→128→256→512…扩容分散在多次小写入中不会在单条大数据写入时集中触发扩容→ 扩容冲突概率极低 → 不丢数据简单说256 是 “刚好不够、又只扩一次” 的死亡容量这样的场景下正确的解决方案方案 1最推荐、零丢失、最高性能直接给足够大的初始容量彻底禁止自动扩容// 一行 ≈500字符给 1024 完全足够永不扩容StringBuildersbnewStringBuilder(1024);方案 2必须用高并发下绝对不能用原生 StringBuilder改用线程安全的StringBuffersbnewStringBuffer(1024);StringBuffer 所有方法加了 synchronized异步 / 多线程下绝对安全。