1、利用synchronized实现同步的基础:Java中的每一个对象都可以作为锁。
(1)对于普通同步方法,锁是当前实例对象。
(2)对于静态同步方法,锁是当前类的Class对象。
(3)对于同步方法块,锁是Synchronized括号里配置的对象。
2、synchronized在JVM中的实现原理:JVM基于进入和退出Monitor对象来实现方法同步和代码块同步。任何对象都有一个monitor与之关联。
3、synchronized用的锁是存在Java对象头中的Mark Word里,Mark Word默认存储对象的HashCode、分代年龄和锁标志位,在运行期间Mark Word里存储的数据会随着锁标志位的变化而变化,长度由虚拟机位数决定(32/64bit)。
4、JavaSE1.6中锁分为4种状态(级别从低到高):无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态,锁可以升级但不能降级,目的是为了提高获取锁和释放锁的效率。
5、锁的优缺点对比
锁 | 优点 | 缺点 | 适用场景 |
偏向锁 | 加锁和解锁不需要额外的消耗,和执行非同步方法相比仅存在纳秒级的差距 | 如果线程间存在锁竞争,会带来额外的锁撤销的消耗 | 适用于只有一个线程访问同步块场景 |
轻量级锁 | 竞争的线程不会阻塞,提高了程序的响应速度 | 如果始终得不到锁竞争的线程,使用自旋会消耗CPU | 追求响应时间,同板块执行速度非常快 |
重量级锁 | 线程竞争不使用自旋,不会消耗CPU | 线程阻塞,响应时间缓慢 | 追求吞吐量,同步块执行速度较长 |