线程安全性——从StringBuffer和StringBuilder的区别说起

面试的时候面试官问到了线程安全的问题,感觉答得不如人意。当时没答好,问面试官如何理解好,他说:可以参照StringBuffer和StringBuilder。于是赶紧回来自行恶补一下。这就是学渣的苦果呀/(ㄒoㄒ)/~~

线程安全性概念

线程安全:就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。
相反地,
线程不安全:就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得的数据是脏数据。

StringBuffer和StringBuilder的区别

从字符串的拼接和读取来看,StringBuilder的速度比StringBuffer要快。这是因为Stringbuffer中方法大都采用了synchronized的关键字修饰。也就是说,StringBuffer中所有的方法都要加锁,所以好多操作看上去都是线性操作的。所以要慢些。就好像集合HashTable和HashMap一样,HashTable是线程安全的,很多方法都是synchronized方法,而HashMap不是线程安全的,但其在单线程程序中的性能比HashTable要高。StringBuffer和StringBuilder类的区别也是如此,他们的原理和操作基本相同,区别在于StringBufferd支持并发操作,线性安全的,适 合多线程中使用。StringBuilder不支持并发操作,线性不安全的,不适合多线程中使用。新引入的StringBuilder类不是线程安全的,但其在单线程中的性能比StringBuffer高。

### Java 中 StringBufferStringBuilder线程安全性 在 Java 编程语言中,`StringBuffer` `StringBuilder` 都提供了可变字符序列的支持。然而,在多线程环境中两者的行为有所不同。 #### StringBuffer线程安全性 `StringBuffer` 是线程安全的,因为它的所有公共方法都被声明为 `synchronized` 方法[^1]。这意味着每当有线程调用这些方法时,都会获得该对象的内部锁,从而防止其他线程在同一时刻对该对象进行修改。虽然这种方式保障了数据的一致性完整性,但也带来了性能成本,因为在高并发的情况下频繁获取释放锁会影响程序效率。 ```java public synchronized StringBuffer append(String str) { super.append(str); return this; } ``` #### StringBuilder线程安全性 相比之下,`StringBuilder` 并不具备内在的线程安全保障;其设计初衷是为了提高单线程下的性能表现[^2]。因此,如果尝试在一个共享实例上由多个线程同时读写,则可能会遇到未定义行为或竞态条件等问题。对于只需要在单一控制流内使用的场合来说,采用 `StringBuilder` 更加合适,因为它避免了不必要的同步开销。 ```java public StringBuilder append(String str) { super.append(str); return this; } ``` 综上所述,当应用程序处于多线程上下文中并且需要确保对同一个字符串缓冲区的安全访问时应选用 `StringBuffer`; 若仅限于单一线程操作或是能够通过外部手段管理好竞争情况的话则推荐使用更高效的 `StringBuilder`.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值