一了解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 monitorexit
- JVM层面 C C++ 调用了操作系统提供的同步机制