-
JVM起线程,与系统内核线程 1:1(golang时M:N)
-
关键字 :synchronized
-
锁的四种状态(锁升级的过程)
-
new(没有锁)--->偏向锁--->轻量级锁--->重量级锁
-
-
可锁对象: 对象(包括this), method
-
-
偏向锁(加标签,不用抢,偏向第一个访问的线程)
-
节约锁竞争损耗,只有一个带synchronized关键字线程访问
-
只要有第二个线程竞争,锁就升级为轻量级锁
-
-
轻量级锁(自旋锁):忙等待(持续消耗系统CPU资源,轻量级效率不一定更高)
-
JUC包--CAS 实现(关键字: AtomicInteger。。。)
-
含义:CompareAndSwap/CompareAndExchange 比较并交换
-
修改值的时候的原子性问题(操作不可分割,由native调用C++,最终实现汇编lock cmpxchg指令)
-
ABA问题:比较时值还是预期,但已经经历过变成B再变回A的过程,可以加版本号解决
-
-
自旋锁达到某个次数,升级为重量级锁
-
-
重量级锁:进队列等待(由操作系统调度)
-
JSR内存屏障
-
LoadLoad屏障
-
StoreStore屏障
-
LoadStore屏障
-
StoreLoad屏障
As if serial ---> 不论怎样乱序执行,单线程执行结果不变
-
-
关键字 : volatile
-
保证线程可见性
-
保证指令有序性(依靠内存屏障, 禁止指令乱序执行)
-
-
JOL(Java Object Layout)Java对象布局
<!-- https://mvnrepository.com/artifact/org.openjdk.jol/jol-core --> <dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId> <version>0.14</version> <scope>provided</scope> </dependency>
-
new Object()获得的实例,占16字节(16 bytes),内存布局如下, 前两部分为对象头
-
MarkWord(8bytes)----对象上锁就是修改对象实例的MarkWord,标记上锁信息
-
锁信息
-
GC---垃圾回收信息
-
hashcode
-
-
Class Pointer(默认4 bytes,如果JVM配置未压缩指针,为8字节)----类型指针指向object.class
-
instance data----实例数据
-
padding----对齐,为了让字节数被8整除而进行补位
-
-
-
缓存
-
缓存行(cache line): 按照工业实践,一般为64字节
-
MESI (Intel芯片的缓存一致性协议)
-
Modified 修改, Exclusive 独占, Shared 共享, Invalid 失效
-
cpu每个cache line
-
-
-
对象创建过程 (因为CPU乱序执行,不保证2,3步先后顺序,* 所以DCL(Double check lock必须用volatile关键字))
-
[半初始化]new指令在堆(Heap)中开辟内存空间,此时成员变量为默认值,如数值型为0,浮点型为0.0等
-
dup指令复制一份指针为下一个指令消耗做准备
-
invokespecial指令调用构造初始化,此时成员变量获得初始值
-
astore指令 将栈(stack)中对象与堆(Heap)内存数据建立关联
-
return指令 new方法结束
-
-
阻塞队列 TransferQueue