Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程安全方法和堆栈_Java - Fatal编程技术网

Java 线程安全方法和堆栈

Java 线程安全方法和堆栈,java,Java,StringBuffer类具有线程安全的方法?好的,但我有一个问题,当调用特定的方法时,它将被加载到堆栈中,堆栈是线程安全的,那么为什么我们需要线程安全的方法呢?很有可能在不同的线程之间共享给定的StringBuffer实例,在这种情况下,多个线程将最终“修改”或者改变StringBuffer的内部状态。这就是为什么需要在StringBuffer上显式同步append方法的原因 但你是对的。如果您不打算跨线程边界共享内容(或者他们称之为“发布”实例),那么在给定的方法调用中创建一个StringB

StringBuffer类具有线程安全的方法?好的,但我有一个问题,当调用特定的方法时,它将被加载到堆栈中,堆栈是线程安全的,那么为什么我们需要线程安全的方法呢?

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

但你是对的。如果您不打算跨线程边界共享内容(或者他们称之为“发布”实例),那么在给定的方法调用中创建一个
StringBuilder
实例(它是
StringBuffer
的非同步兄弟)并将其丢弃(或者更类似于让GC处理)方法调用结束后

当您必须跨线程共享实例,同时又觉得同步每个操作的成本太高时,还有另一个方面可以发挥作用——线程局部变量。基本上,本例中的想法是使每个线程都有自己的“可变”实体副本。不需要锁定,因为当其他线程尝试访问线程局部变量时,您就可以切换到一个新的/预配置的实例。这通常用于共享
StringBuilder
DateFormat
实例,以提高性能

如果您想比较线程之间对可变对象的原始/不安全共享与使用线程本地对象之间的差异,请查看