14. StringBuffer 与 StringBuilder 区别

博客指出StringBuilder是线程安全的,这属于Java编程中的重要知识点,对于Java开发及面试有一定参考价值。
StringBuilder 是线程安全的!
### Java 中常见类的线程安全性分析 在多线程环境中,某些 Java 类由于其内部实现机制,可能具备线程安全特性,而另一些则需要开发者自行处理同步问题。以下是对 `java.lang.StringBuffer`、`java.lang.StringBuilder`、`java.text.SimpleDateFormat` 和 `java.time.format.DateTimeFormatter` 的线程安全性分析: #### `java.lang.StringBuffer` 该类是为了解决字符串拼接过程中产生大量中间对象的问题而设计的。其内部方法使用了 `synchronized` 关键字,确保了在多线程环境下的线程安全性[^1]。因此,`StringBuffer` 是线程安全的,适用于并发场景下的字符串操作。 #### `java.lang.StringBuilder` `StringBuilder` 的功能 `StringBuffer` 相同,但其内部方法没有使用 `synchronized` 关键字,因此不提供线程安全性。其设计目标是减少同步带来的性能开销,适用于单线程环境下的字符串操作[^1]。 #### `java.text.SimpleDateFormat` 该类用于格式化和解析日期字符串,但其内部状态不是线程安全的。在多线程环境中,如果多个线程共享同一个 `SimpleDateFormat` 实例,可能会导致解析或格式化结果不一致的问题。因此,`SimpleDateFormat` 不是线程安全的,建议在多线程环境中使用局部变量或通过 `ThreadLocal` 进行封装。 #### `java.time.format.DateTimeFormatter` 该类是 Java 8 引入的 `java.time` 包中的一部分,用于替代 `SimpleDateFormat`。 `SimpleDateFormat` 不同的是,`DateTimeFormatter` 是不可变对象,其内部状态不会在格式化或解析过程中发生变化。因此,它是线程安全的,可以在多线程环境中共享使用[^2]。 --- ### 示例代码:线程安全非线程安全类的对比 #### `StringBuffer` 的线程安全使用示例 ```java public class StringBufferExample { private static final StringBuffer buffer = new StringBuffer(); public static void main(String[] args) { Thread t1 = new Thread(() -> { for (int i = 0; i < 1000; i++) { buffer.append("a"); } }); Thread t2 = new Thread(() -> { for (int i = 0; i < 1000; i++) { buffer.append("b"); } }); t1.start(); t2.start(); try { t1.join(); t2.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Buffer length: " + buffer.length()); } } ``` #### `SimpleDateFormat` 的线程不安全示例 ```java import java.text.SimpleDateFormat; import java.util.Date; public class SimpleDateFormatExample { private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); public static void main(String[] args) { Runnable task = () -> { for (int i = 0; i < 10; i++) { try { String formatted = sdf.format(new Date()); System.out.println(formatted); Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } }; Thread t1 = new Thread(task); Thread t2 = new Thread(task); t1.start(); t2.start(); } } ``` #### `DateTimeFormatter` 的线程安全使用示例 ```java import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; public class DateTimeFormatterExample { private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); public static void main(String[] args) { Runnable task = () -> { for (int i = 0; i < 10; i++) { try { String formatted = formatter.format(LocalDateTime.now()); System.out.println(formatted); Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } }; Thread t1 = new Thread(task); Thread t2 = new Thread(task); t1.start(); t2.start(); } } ``` --- ### 总结 | 类名 | 线程安全 | 说明 | |------|----------|------| | `StringBuffer` | ✅ | 使用 `synchronized` 确保线程安全,适用于多线程环境 | | `StringBuilder` | ❌ | 没有同步机制,适用于单线程环境 | | `SimpleDateFormat` | ❌ | 内部状态可变,不适用于多线程共享 | | `DateTimeFormatter` | ✅ | 不可变对象,适用于多线程环境 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值