线程安全方法和堆栈

时间:2012-11-03 07:49:04

标签: java

StringBuffer类是否具有线程安全的方法?好的,但我有疑问,当调用特定的方法然后它将被加载到堆栈并且堆栈是线程安全的,那么为什么我们需要线程安全的方法?

1 个答案:

答案 0 :(得分:3)

很有可能在不同的线程之间共享给定的StringBuffer实例,在这种情况下,多个线程将最终“修改”或改变StringBuffer的内部状态。这就是为什么需要在append上明确同步StringBuffer方法。

但你是对的。如果你不打算跨线程边界共享东西(或者他们称之为“发布”实例),那么创建一个StringBuilder实例({{1}的非同步兄弟更合乎逻辑在方法调用结束后,在给定的方法调用中抛出它(或更像是让GC处理它)。

当您必须跨线程共享实例并且同时感觉同步每个操作的成本太多时,还有另一个方面发挥作用 - 线程本地。基本上,在这种情况下的想法是使每个线程具有其自己的“可变”实体的副本。不需要锁定,因为当其他一些线程尝试访问线程局部变量时,您需要切换新的/预配置的实例。这通常用于共享StringBufferStringBuilder实例以提高性能。

如果要比较线程之间的可变对象的原始/不安全共享与使用本地线程之间的比较,请查看snippet I have hosted on Bitbucket