利用synchronized实现同步的基础
Java 中的每一个对象都可以作为锁,具体表现为三种形式:
- 对于普通同步方法,锁的是当前实例对象;
- 对于静态同步方法,锁的是当前类的class对象;
- 对于同步代码块,锁的是synchronzied括号中配置的对象。
(静态为何锁的是class对象:synchronzied方法执行之前需要一个monitor,对于一个静态方法而言,monitor关联的是类对象;对于一个普通方法而言,monitor关联的是this对象)
java对象头
Synchronized用的锁是存在java对象头里的,如果对象头是数组类型,则虚拟机用3个字宽存储对象头;如果对象是非数组类型,则用2字宽存储对象头。
synchronzied实现原理(java对synchronied优化)
synchronized 是由一对 monitorenter/monitorexit 指令实现的,monitor 对象是同步的基本实现单元。在 Java 6 之前,monitor 的实现完全是依靠操作系统内部的互斥锁,因为需要进行用户态到内核态的切换,所以同步操作是一个无差别的重量级操作,性能也很低。但在 Java 6 的时候,JVM 对此进行了改进,提供了三种不同的 monitor 实现,也就是常说的三种不同的锁:偏向锁(Biased Locking)、轻量级锁和重量级锁,大大改进了其性能。
synch