synchronized

  • 锁的是对象不是代码

  • this XX.class

  • 锁定方法和非锁定方法可以同时执行

  • 锁升级

synchronized锁升级的概念

JDK早期它是重量级锁-OS

升级后,如果只有一个线程,markword就会记录这个线程ID,偏向锁,默认情况下它以为不会有第二个线程来访问

如果有线程争用了,就会升级为自旋锁,默认是自旋10次

10次之后,就会升级为重量级锁-OS

执行时间短,线程数少的 用自旋锁(占CPU,在用户态解决锁的问题,效率比内核态的高)

执行时间长,线程数多的 用重量级锁-OS(不占CPU,在内核态解决锁的问题)

volatile

  • 保证线程可见性
  • 禁止指令重排序