线程间共享对象的性能影响是什么?

时间:2011-07-01 08:49:33

标签: java multithreading performance memory concurrency

我知道只要没有写入对象,从多个线程中的单个对象读取在Java中是安全的。但是,这样做的性能影响是什么,而不是每个线程复制数据?

线程是否必须等待其他人读完内存?或者是隐式复制数据(volatile存在的原因)?但是对于整个JVM的内存使用情况会怎样呢?当读取的对象比读取它的线程更旧而不是在它们的生命周期中创建时,它们如何区别?

3 个答案:

答案 0 :(得分:3)

如果知道对象不会更改(例如,不可变对象,如String或Integer),并且因此避免使用任何同步构造(synchronized,{{ 1}}),从多个线程读取该对象对性能没有任何影响。所有线程都将访问并行存储对象的内存。

然而,出于性能原因,JVM可以选择在每个线程中本地缓存一些值。 volatile的使用仅禁止该行为--JVM必须每次都明确地和原子地访问volatile字段。

答案 1 :(得分:1)

如果正在读取数据,则没有任何含义,因为多个线程可以同时访问同一个内存。只有在因锁定机制而发生写入时才会收到性能损失。关于volatile的注意事项(不能记住它在Java中是否与C相同),但它用于可以从程序下面更改的数据(如c中数据的直接寻址),或者你想要数据的原子性。复制数据不会对性能产生影响,但会占用更多内存。

答案 2 :(得分:1)

要在多个线程之间建立共享状态 - 您必须使用某种同步机制协调对它的访问 - volatile,synchronization,cas。我不确定您对“性能影响”的期望是什么 - 它将取决于具体的场景和背景。通常,您需要为多个线程协调对共享对象的访问付出一些代价。