为什么不要用 StringBuffer 和 Vector

尽管StringBuffer和Vector是线程安全的,但其同步机制在多线程场景下可能增加不必要的性能开销且无法确保操作的原子性。通常情况下,推荐使用非同步的StringBuilder和ArrayList,除非在特定的Swing组件模型中需要与Vector交互。
摘要由CSDN通过智能技术生成

原文链接

很多人在回答新手提问的时候会说,StringBuilder 是非同步的,所以快一些,StringBuffer是同步(线程安全)的,所以慢一些。

从技术上说这句话是没有错的,但是为什么多线程的时候仍然用 StringBuilder,不建议用StringBuffer(StringBuffer 建议永远不要使用)?

简单的说,StringBuffer的“线程安全”在大多数时候增加了大量不必要的成本,并且未必达到目的。
看下面的代码:

StringBuffer buffer = getStringBuffer();
for(int i=0; i<10000; i++)   buffer.append(i); // append 方法上由关键字 synchronized ,是同步方法

StringBuffer 的每一步操作都先获取同步锁,然后释放同步锁。
所以这段代码中,它获取了10000次锁,释放了10000次锁。

除了获取、释放10000次锁的高昂成本之外,它真的实现了“线程安全”的目的吗?
假如在这个for循环运行的过程中,有另一个线程对 buffer 做了操作:

buffer.append("some string");

那么这个 "some string"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值