synchronized 的实现原理与应用

synchronized 的实现原理与应用

先来看下利用 synchronized 实现同步的基础:Java 中的每一个对象都可以作为锁。具体表现为以下三种形式。

  • 对于普通同步方法,锁是当前实例对象。
  • 对于静态同步方法,锁是当前类的 Class 对象。
  • 对于同步方法块,锁是 synchronized 括号里配置的对象。

当一个线程试图访问同步代码块时,它首先必须得到锁,退出或抛出异常时必须释放锁。那么锁到底存在哪里?锁里面会存储什么信息呢?

从 JVM 规范中可以看到 synchronized 在 JVM 里的实现原理,

JMM关于 synchronized 的两条规定:

  • 线程解锁钱,必须把共享变量的最新值刷新到主内存中
  • 线程加锁时,将清空工作内存中共享变量的值,从而使用共享变量时需要从内存中重新读取最新的值