`

java避免缓存伪共享

 
阅读更多
java8之前的做法:
加6个无用的long字段
如:

 public final static class VolatileLong2 {       
        private long value ;  
        private long q0, q1, q2, q3, q4, q5, q6;  
    }  




上面的做法其实有个问题:每个CPU微架构的cache line大小不一定一样,这种手动添加固定的padding字段的做法有可能浪费了空间、也有可能不够用。最好还是让VM来解决这个问题。
JVM在计算对象布局时会知道有字段被标记上了@Contended而自动根据CPU的特性给这个类添加padding,而不必手动去添加padding字段
可以参考:https://www.zhihu.com/question/30538696 中R大的回答

java8的做法:

使用  @sun.misc.Contended   注解,java8中的并发map就有用到的
注意 :jvm启动时设置-XX:-RestrictContended

如:


    public final static class VolatileLong3 {  
     @sun.misc.Contended  
        private long value ;  
    } 


分享到:
评论

相关推荐

    Java中的伪共享详解及解决方案.docx

    ### Java中的伪共享详解及解决方案 #### 1. 什么是伪共享 伪共享(False Sharing)是在多线程环境中出现的一种现象,特别是在涉及多核处理器的情况下更为显著。在现代计算机体系结构中,CPU缓存系统是以缓存行(Cache...

    Java 中的伪共享详解及解决方案

    "Java 中的伪共享详解及解决方案" Java 中的伪共享问题是指在多线程情况下,多个线程访问共享同一个缓存行的变量时,可能会无意中影响彼此的性能。这种问题的出现是因为 CPU 缓存系统中是以缓存行(cache line)为...

    JAVA-缓存行对齐测试方法

    2. **缓存冲突**:如果两个线程分别修改不同对象的相邻成员变量,它们可能位于同一缓存行,导致每次写操作都会使另一线程的缓存失效,这称为伪共享(False Sharing)。这会导致不必要的缓存刷新和额外的通信开销,...

    【并发编程】 — 伪共享(False Sharing)底层原理及其解决方式

    1.2 缓存行的概念1.3 伪共享(False Sharing)的概念 + 其可能引发的性能问题2 如何避免伪共享 — 数据填充2.1 不使用数据填充时的效率验证2.2 手动进行数据填充的效率验证2.3 通过java8新特性@sun.misc.Contended...

    p71 - p91 CPU是如何来执行任务的

    CPU是计算机的核心部件,负责执行计算和控制任务。...特别是在多核系统中,避免缓存伪共享可以显著提升并发程序的运行效率。通过学习和掌握这些知识,开发者可以编写出更加高效、适应现代硬件的代码。

    高级Java经典面试题2019

    伪共享发生在多线程环境中,当多个线程频繁修改位于同一CPU高速缓存行上的不同变量时,可能导致整个缓存行被频繁地在不同的CPU之间传递,从而降低程序性能。可以通过将数据结构设计得更加合理来避免伪共享。 #### ...

    Java 80 道面试题及答案.docx

    伪共享是多线程系统中一个众所周知的性能问题。它发生在不同处理器的上的线程对变量的修改依赖于相同的缓存行。 wait() 方法 wait() 方法是 Java 中的一个方法,用于线程同步。wait() 方法应该在循环中调用,以...

    java面试面试资料

    - **解决方法**: 避免伪共享的一种常见方法是合理安排数据结构的布局,使得不同的线程访问不同的缓存行。 #### 7. Busyspin技术及其用途 - **定义**: Busyspin是一种在线程等待事件发生时不放弃CPU控制权的技术。...

    120道Java面试题以及答案.doc

    - 伪共享是指不同线程对位于同一缓存行内的变量进行修改,导致不必要的缓存失效和额外的通信开销。解决这个问题需要仔细调整数据结构,以避免变量在内存中的紧密排列。 5. **忙等待(Busy Spin)** - 忙等待是一...

    spring+ibatis+oracle分页缓存源码

    一级缓存是iBatis默认提供的,它存在于SqlSession级别,同一SqlSession内的多次查询会共享结果,避免了重复的数据库访问。然而,跨SqlSession的查询无法利用一级缓存,这时二级缓存就显得尤为重要。二级缓存是基于...

    2023Java80道面试题及答案

    多线程环境中的伪共享(False Sharing)是指,不同线程对位于同一缓存行的不同变量的修改,可能导致性能下降,因为这种修改可能会引起不必要的缓存刷新。为了解决这个问题,开发者可以使用对齐(padding)或其他优化...

    java面试题.doc

    例如,当一个线程修改了一个缓存行的一部分,而另一个线程也试图访问或修改同一个缓存行的另一部分时,就会发生伪共享。 **7. Busy Spin及其用途** Busy spin是一种等待策略,其中线程不会释放CPU资源,而是不断地...

    Java 80道面试题和答案.docx

    即使各线程操作的变量实际并不共享,但由于它们映射到了同一缓存行,导致线程间的通信开销增大,这就是伪共享问题。 7. **忙等待(Busy Spin)**:在某些需要低延迟的场景下,忙等待是一种策略,它通过不断循环检查...

    分布式id生成器.zip

    采用RingBuffer来缓存已生成的UID, 并行化UID的生产和消费, 同时对CacheLine补齐,避免了由RingBuffer带来的硬件级「伪共享」问题. 最终单机QPS可达600万。 依赖版本:Java8及以上版本, MySQL(内置WorkerID分配...

Global site tag (gtag.js) - Google Analytics