synchronized的实现原理
在多线程并发编程中Synchronized一直是一个元老角色,称之为重量级锁。但是在Java 1.6之后对Synchronized进行了各种优化,使其性能得到很大提升。使用起来也不像之前那么重了。
Synchronized的使用方法
Java中每一个对象都可以作为锁, Synchronized有三种用法:
- 对于普通同步方法,锁是当前实例对象;
- 对于静态同步方法,锁是当前类的Class对象;
- 对于同步方法块,锁是Synchronized括号里配置的对象。
Synchronized如何同步
Synchronized实现同步的机制是建立在JVM基础之上的,JVM基于进入和退出Monitor实现方法和代码块的同步。当JVM编译代码时如果发现了Synchronized关键字,就会在同步代码的开始位置插入monitorenter指令,在同步代码的结束位置或异常处插入monitorexit指令。JVM会保证每个monitorenter与monitorexit成对出现。如下图所示:
Synchronized与Java对象头
Synchronized用到的锁是存放在Java对象头中的,JVM中存放的Java对象的数据结构包含三个部分:对象头,实例数据,对齐填充。其中对象头如下图所示:
在对象头的Mark Word中存放着Java对象的运行时数据:HashCode、GC分代年龄、锁状态标识、线程持有的锁、偏向线程ID、偏向时间戳等。