2011-07-01 46 views
5

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

线程是否必须等待其他人读完内存?或者是隐式复制的数据(存在的原因是volatile)?但是,对于整个JVM的内存使用情况呢?如果读取的对象比读取对象的线程早,而不是在它们的生命周期中创建的线程,它们又有什么不同?

回答

3

如果知道一个对象将不改变(例如不可变的对象,如字符串或整数),并且具有,因此,避免使用任何同步结构(​​,volatile)的,读取来自多个线程该对象确实对性能没有任何影响。所有线程将访问并行存储对象的内存。

但是,出于性能原因,JVM可能会选择在每个线程中本地缓存一些值。使用volatile禁止这种行为 - JVM将不得不每次明确和原子地访问volatile字段。

+0

这回答我的问题,谢谢,这是一个接受。我对并行访问如何在硬件层面上工作感兴趣,但也许不在这个特定问题的范围之内。 –

1

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

1

要在多个线程之间共享状态 - 必须使用某种同步机制(volatile,synchronous,cas)来协调对它的访问。我不确定你期望听到什么“表现含义” - 它将取决于具体的场景和背景。一般来说,你需要付出一定的代价才能通过多线程来协调对共享对象的访问。