同步
同步是一种并发操作机制,用来预防、避免对资源不适当的交替使用(一般称为竞争),保障交替使用资源的安全。Java使用线程来实现并发。互斥是同步的特殊情况,即同一时间最多允许一个线程访问受保护的代码或者数据。HotSpot VM使用监视器(monitor)对象来保障线程运行代码之间的互斥。
HotSpot VM吸收了非竞争和竞争性同步操作的最先进技术,极大的提高了同步性能。
非竞争性同步,指的是同一个线程里在其他无归属monitor对象(未被任何线程拥有的对象)上的同步操作,Java 5 HotSpot VM中引入了偏向锁
,用于对象在其生命周期内最多只被一个线程锁住,一旦开启偏向锁,该线程不需要借助原子指令就可以对该对象进行锁定和解锁。
竞争性同步操作可以使用高级自适应自旋锁
技术来改善吞吐量。
HotSpot VM内部表示Java对象的第一个字(Word),包含了Java对象的同步状态编码,通常称为标记字(Mark Word)。为了节约空间,标记字会依据不同的状态复用存储空间。包含以下对象同步状态:
- 中立:已解锁
- 偏向:已锁定/已解锁且无共享
- 栈锁:已锁定且共享,但非竞争,共享的意思是该标记指向锁对象在线程栈中的标记字副本。
- 膨胀:已锁定/已解锁且共享和竞争。线程在monitor-enter或者wait()时被阻塞。该标记指向一个重型的object-monitor结构。