JMM

    技术2023-11-28  113

    一了解CPU内存工作模式

      1.CPU 有高速缓存 网上帖子一堆 大概有L1 L2 L3   CPU多核 所以存在数据一致性   CPU数据一致性为 MESI+总线锁(也有其他算法)

      2.CPU 的缓存存储单元 cacheline 64byte CPU读取都是读取一块64字节 不是单独读取某个字节 所以当多个线程 读取同一个内存块 因为缓存一致性所以会频繁刷新内存 如图: 1个格子 为8字节的 long类型

    代码示例:

    C 类初始化大概为 对象头8字节 classpoint 4字节 实例数据 56字节 padding 4字节 大于一个cacheline的内容 2个对象就不会再一个缓存块内 比 只有一个变量的效率要高

    JVM为了解决有序性 

      LoadLoad屏障: 对于这样的语句Load1; LoadLoad; Load2,

      在Load2及后续读取操作要读取的数据被访问前,保证Load1要读取的数据被读取完毕。

      StoreStore屏障:

      对于这样的语句Store1; StoreStore; Store2,

      在Store2及后续写入操作执行前,保证Store1的写入操作对其它处理器可见。

      LoadStore屏障:

      对于这样的语句Load1; LoadStore; Store2,

      在Store2及后续写入操作被刷出前,保证Load1要读取的数据被读取完毕。

      StoreLoad屏障: 对于这样的语句Store1; StoreLoad; Load2,

    ​   在Load2及后续所有读取操作执行前,保证Store1的写入对所有处理器可见。

    1.VOLATILE 实现

       1.字节码层面 ACC_VOLATILE

       2.JVM层面 volatile内存区的读写 都加屏障

      StoreStoreBarrier

      volatile 写操作

      StoreLoadBarrier

      LoadLoadBarrier

      volatile 读操作

      LoadStoreBarrier

    2.synchronized 

    字节码层面 ACC_SYNCHRONIZED monitorenter monitorexitJVM层面 C C++ 调用了操作系统提供的同步机制

     

    Processed: 0.009, SQL: 9