Java 线程间共享对象的性能含义是什么?

Java 线程间共享对象的性能含义是什么?,java,multithreading,performance,memory,concurrency,Java,Multithreading,Performance,Memory,Concurrency,我知道,在Java中,跨多个线程读取单个对象是安全的,只要该对象没有写入。但是这样做而不是复制每个线程的数据会对性能产生什么影响呢 线程是否必须等待其他线程完成内存读取?或者数据是隐式复制的(存在volatile的原因)?但这会对整个JVM的内存使用产生什么影响呢?当正在读取的对象比读取它的线程旧,而不是在其生命周期中创建的对象时,这一切又有什么不同呢?如果正在读取数据,则没有任何意义,因为多个线程可以同时访问同一内存。只有在由于锁定机制而发生写入时,您才会收到性能影响。请注意volatile(

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


线程是否必须等待其他线程完成内存读取?或者数据是隐式复制的(存在
volatile
的原因)?但这会对整个JVM的内存使用产生什么影响呢?当正在读取的对象比读取它的线程旧,而不是在其生命周期中创建的对象时,这一切又有什么不同呢?

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

要在多个线程之间共享状态,您必须使用一些同步机制协调对数据的访问—volatile、synchronization、cas。我不确定你期望听到什么“性能含义”-这将取决于具体的场景和背景。通常,您将为必须协调多个线程对共享对象的访问而付出一定代价。

如果您知道某个对象不会更改(例如字符串或整数等不可变对象),因此避免使用任何同步结构(
synchronized
volatile
),从多个线程读取该对象不会对性能产生任何影响。所有线程都将访问并行存储对象的内存


但是,出于性能原因,JVM可能会选择在每个线程中本地缓存一些值。使用
volatile
仅禁止这种行为-JVM每次都必须显式地、原子式地访问
volatile
字段。

这回答了我的问题,谢谢,这里有一个接受。我感兴趣的是并行访问如何在硬件级别上工作,但这可能超出了这个特定问题的范围。