总结:
{内存可见:lock总线锁+缓存锁+mesi协议
指令重排:lock总线锁+jvm内存屏障}
乱序执行:国外博客: https://preshing.com/20120515/memory-reordering-caught-in-the-act/
jvm/jmm/Disorder.java
禁止乱序
CPU层面:Intel -> 原语(mfence lfence sfence) 或者锁总线
JVM层级:8个hanppens-before原则 4个内存屏障 (LL LS SL SS)
as-if-serial : 不管硬件什么顺序,单线程执行的结果不变,看上去像是serial
dup:复制一下,防止栈丢失
inwokespecial:执行到这里m=8
为什么dcl要加voliate:创建过程有一个中间态,new到一半会发生指令重排(先执行astore_1再执行inwokespecial)第二个线程判断不为空实际只取到对象中间状态
禁止指令重排:
一, cpu层级
如果是intelcpu:
1.硬件层面:
(1):三条汇编原语l奋s s奋s()Intel -> 原语(mfence lfence sfence) :只有英特尔cpu可以
(2):lock锁总线(lock是老大,lock (寄存器)+0啥也没做 ) 所有cpu,所以用lock
2.软件层面:
software Locks 通常使用了内存屏障或者原子指令来实现
二,
JVM层级:8个hanppens-before原则 4个内存屏障 (LL LS SL SS)
voliate:硬件层面实现,没有用原语,直接用锁(lock总线锁 +jvm内存屏障 )
voliate:修饰一个类,官方没有查到,new出来的内存空间,前后都加屏障
(synchonized,cas都是lock comxchang ,分清楚,一个是有个升级过程,一个是比较替换过程)
面试题:使用队列(sig)
合并写技术
UMA:多个cpu共享一个内存
NUMA:优先访问自己内存,通过总线再访问别家内存
ZGC - NUMA aware
分配内存会优先分配该线程所在CPU的最近内存
软件与硬件结合:
用户态与内核态
级别不同 r0级 指令 r3级指令
内核态:读磁盘,内存 ,创建一个线程 ring0级
用户态:应用层面 ring3级 jvm程序,各种程序
六,进程,线程,纤程
面试高频:进程和线程有什么区别?
答案:进程就是一个程序运行起来的状态,线程是一个进程中的不同的执行路径。专业:进程是OS分配资源的基本单位,线程是执行调度的基本单位。分配资源最重要的是:独立的内存空间,线程调度执行(线程共享进程的内存空间,没有自己独立的内存空间)