synchronized锁是啥?锁其实就是一个对象,随便哪一个都可以,Java中所有的对象都是锁,换句话说,Java中所有对象都可以成为锁。
这次我们主要聊的是synchronized锁升级的套路
synchronized
会经历四个阶段:无锁状态
、偏向锁
、轻量级锁
、重量级锁
依次从耗费资源最少,性能最高,到耗费资源多,性能最差。
锁原理
先看看这些状态的锁为什么称之为锁,他们的互斥原理是啥。
偏向锁
当一个线程到达同步代码块,尝试获取锁对象的时候,会查看对象头中的MarkWord
里的线程ID,如果这里没有ID则将自己的保存进去,拿到锁。若是有,则查看是否是当前线程,如果不是,就CAS尝试改,如果是,就已经拿到了锁资源。
这里详细说说CAS尝试修改的逻辑:它会检查持有偏向锁的线程状态。首先遍历当前JVM的所有存活的线程,如果能找到偏向的线程,则说明偏向的线程还存活,此时会检查线程是否在执行同步代码块中的代码,如果是,则升级为轻量级锁,去继续进行CAS竞争锁。所以加了偏向锁之后,同时只有一个线程可以拿到锁执行同步代码块中的代码。
轻量级锁
查看对象头中的MarkWord
里的Lock Record
指针指向的是否是当前线程的虚拟机栈