sychronized学习

目录

  1. 简介
  2. Tips
  3. MarkWord
  4. 锁优化

简介

synchronized是Java关键字,对代码块或方法进行修饰,实现一种简单的策略来防止线程干扰和内存一致性错误,如果一个对象对多个线程是可见的,那么对该对象的所有读或者写都将通过同步的方式来进行。具体表现如下:

  1. 提供一种锁机制,确保共享变量的互斥访问

  2. 包括monitorentermonitorexit两个JVM指令,它能够保证在任何时候任何线程执行到monitorenter成功之前都必须从主内存中获取数据,在monitorexit运行成功之后,共享变量被更新后的值必须刷入主内存

  3. 严格遵守happens-before规则,一个monitorexit指令之前必定要有一个monitorenter

Tips

  • 同步方法JVM采用ACC_SYNCHRONIZED标记符来实现同步,和monitorenter,monitorexit都是基于Monitor实现,在HotSpot虚拟机中是ObjectMonitor实现的。

  • synchronized持有Monitor锁属于排他的、可重入锁

  • synchronized导致线程的阻塞无法被中断

  • synchronized可以保证原子性、有序性和可见性

MarkWord

锁优化

  • 偏向锁、轻量级锁、重量级锁(Mutex互斥锁实现)
  • 锁消除/锁粗化

JIT时根据代码逃逸技术进行锁优化