Java 线程安全方法和堆栈
StringBuffer类具有线程安全的方法?好的,但我有一个问题,当调用特定的方法时,它将被加载到堆栈中,堆栈是线程安全的,那么为什么我们需要线程安全的方法呢?很有可能在不同的线程之间共享给定的Java 线程安全方法和堆栈,java,Java,StringBuffer类具有线程安全的方法?好的,但我有一个问题,当调用特定的方法时,它将被加载到堆栈中,堆栈是线程安全的,那么为什么我们需要线程安全的方法呢?很有可能在不同的线程之间共享给定的StringBuffer实例,在这种情况下,多个线程将最终“修改”或者改变StringBuffer的内部状态。这就是为什么需要在StringBuffer上显式同步append方法的原因 但你是对的。如果您不打算跨线程边界共享内容(或者他们称之为“发布”实例),那么在给定的方法调用中创建一个StringB
StringBuffer
实例,在这种情况下,多个线程将最终“修改”或者改变StringBuffer
的内部状态。这就是为什么需要在StringBuffer
上显式同步append
方法的原因
但你是对的。如果您不打算跨线程边界共享内容(或者他们称之为“发布”实例),那么在给定的方法调用中创建一个StringBuilder
实例(它是StringBuffer
的非同步兄弟)并将其丢弃(或者更类似于让GC处理)方法调用结束后
当您必须跨线程共享实例,同时又觉得同步每个操作的成本太高时,还有另一个方面可以发挥作用——线程局部变量。基本上,本例中的想法是使每个线程都有自己的“可变”实体副本。不需要锁定,因为当其他线程尝试访问线程局部变量时,您就可以切换到一个新的/预配置的实例。这通常用于共享StringBuilder
和DateFormat
实例,以提高性能
如果您想比较线程之间对可变对象的原始/不安全共享与使用线程本地对象之间的差异,请查看