synchronized 的实现原理与应用
先来看下利用 synchronized 实现同步的基础:Java 中的每一个对象都可以作为锁。具体表现为以下三种形式。
- 对于普通同步方法,锁是当前实例对象。
- 对于静态同步方法,锁是当前类的 Class 对象。
- 对于同步方法块,锁是 synchronized 括号里配置的对象。
当一个线程试图访问同步代码块时,它首先必须得到锁,退出或抛出异常时必须释放锁。那么锁到底存在哪里?锁里面会存储什么信息呢?
从 JVM 规范中可以看到 synchronized 在 JVM 里的实现原理,
JMM关于 synchronized 的两条规定:
- 线程解锁钱,必须把共享变量的最新值刷新到主内存中
- 线程加锁时,将清空工作内存中共享变量的值,从而使用共享变量时需要从内存中重新读取最新的值