高并发专题

151 阅读2分钟
  • synchronized底层原理:编译后的jvm指令中,会有monitorenter和monitorexit两个指令,加锁就执行monitorenter,释放就执行monitorexit,每个对象实例都有一个关联的monitor,一个类的class对象也有一个monitor,锁一下计数器就加1,另一个线程对此对象加锁的时候看计数器不是0,就阻塞

  • CAS :compare and set

  • java内存模型:read,load,use,assign,store,write

  • flush处理器缓存:把更新的值刷到告诉缓存或者主内存,还会发送一个消息到总线,通知其他处理器,这个变量的值被修改了

  • refresh处理器缓存:如果从总线处得知值被修改了,就会把其他高速缓存或者主内存的值读到自己缓存中

  • 处理器可能会对指令重排序,再经过重排序处理器按照处理器接收到的指令顺序发送给高速缓存或者写缓冲器

  • 内存指令重排:storestore,storeload,loadload,loadstore,load读高速缓存,store写缓冲器

  • 可见性:MESI协议,flush,refresh配合 有序性:三个层次的重排 原子性:基本赋值操作可以保证原子性,复杂不保证

  • synchronized代码块开始执行monitorenter时会加一个load内存屏障(强制refresh),和Aquire内存屏障(读操作不会指令重排), 离开时执行store内存屏障(强制flush)和release内存屏障(写操作不会指令重排)

  • synchronized从1.6后做了优化, 锁消除:如果只有一个线程执行,jit编译的时候会锁消除,去掉monitorenter 锁粗化: 如果多个锁有可能会合并 偏向锁:可能只有1个线程竞争锁,就会维护一个Bias偏好,如果有其他线程竞争这个锁,就会回收这个 轻量级锁:把mark word的一个轻量级锁指针指向自己,失败后就改成重量级锁

    java内存模型图

    指令重排场景

    MESI硬件级别原理

    synchronized底层原理

    volatile底层原理