【问题标题】:What are the performance implication of sharing objects among threads?在线程之间共享对象对性能有何影响?
【发布时间】:2011-09-26 14:27:28
【问题描述】:

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

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

【问题讨论】:

    标签: java multithreading performance memory concurrency


    【解决方案1】:

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

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

    【讨论】:

    • 这回答了我的问题,所以谢谢,这是一个接受。我对并行访问如何在硬件级别上工作很感兴趣,但这可能超出了这个特定问题的范围。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      要在多个线程之间共享状态 - 您必须使用一些同步机制来协调对它的访问 - volatile、同步、cas。我不确定您希望听到关于“性能影响”的内容 - 这将取决于具体的场景和上下文。一般来说,您需要为必须协调多个线程对共享对象的访问付出一些代价。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多