synchronized
synchronized
是一种对象锁(锁的是对象而非引用),作用粒度是对象,java中每个对象都可以上锁(同一时间只有一个线程能上锁成功),而且通过对象内部存储的markword
标记锁状态。
在jdk老版本的时候使用的是重量级锁,但是在jdk更新之后才出现的锁升级。
锁一般分为4个转态:无锁->偏向锁->轻量级锁->重量级锁。
锁升级的过程是不可逆的。
偏向锁:
当只有一个线程a获得锁时,这个时候锁为偏向锁,这个时候markword就指向a,当a请求锁的时候,就无需任何的操作了,这样可以省很多时间。
轻量级锁:
当线程A获得锁之后,这个时候又来了线程B申请锁,这个时候就有了竞争关系,这个时候就出现了轻量级锁,如果A这时候还在使用锁,B这时候就会自旋,B认为A不会使用太长的时间,如果当B来了之后A不在使用了,这个时候markword直接指向B。一般情况下这样子的情况比较多,可以更好的节约cpu的利用率。
重量级锁:
跟上面轻量级锁差不多,但是不一样的是,当A在使用的时候,这时候markword是指向A的,这时候B来了,CDE也来了,这时候BCDE会互相竞争,但是竞争力度比轻量级锁大,这个时候重量级锁依赖操作系统的Mutex lock
实现,此时等待锁的线程挂起,当锁释放后再由操作系统唤醒重新尝试获取锁,由于借助操作系统,导致用户态内核态切换,此过程时间成本比较高。
在原始的时候synchronzie使用的就是重量级锁,使用的cpu效率不是很高,到现在使用的才是锁升级过程。