juc之synchronized

synchronized

synchronized,即俗称的【对象锁】,它采用互斥的方式让同一时刻至多只有一个线程能持有【对象锁】,其它线程再想获取这个【对象锁】时就会阻塞住。这样就能保证拥有锁的线程可以安全的执行临界区内的代码,不用担心线程上下文切换
synchronized 实际是用对象锁保证了临界区内代码的原子性,临界区内的代码对外是不可分割的,不会被线程切换所打断。
注意:
虽然 java 中互斥和同步都可以采用 synchronized 关键字来完成,但它们还是有区别的:

  • 互斥是保证临界区的竞态条件发生,同一时刻只能有一个线程执行临界区代码
  • 同步是由于线程执行的先后、顺序不同、需要一个线程等待其它线程运行到某个点

原理

对象头

juc之synchronized
juc之synchronized
juc之synchronized

Monitor

Monitor 被翻译为监视器或管程
每个 Java 对象都可以关联一个 Monitor 对象,如果使用 synchronized 给对象上锁(重量级)之后,该对象头的Mark Word 中就被设置指向 Monitor 对象的指针。
juc之synchronized
juc之synchronized
juc之synchronized
注意:

  • synchronized 必须是进入同一个对象的 monitor 才有上述的效果
  • 不加 synchronized 的对象不会关联监视器,不遵从以上规则

轻量级锁

juc之synchronized
juc之synchronized
juc之synchronized
juc之synchronized
juc之synchronized

锁膨胀

juc之synchronized
juc之synchronized
juc之synchronized
juc之synchronized

自旋优化

juc之synchronized
juc之synchronized

偏向锁

juc之synchronized
juc之synchronized
juc之synchronized

上一篇:ARM CCA(Arm Confidential Compute Architecture)介绍


下一篇:【conan error】 Detected a mismatch for the compiler version between your conan profile