文章目录
轻量级锁和重量级锁区别什么是CAS、重量级锁轻量级锁的ABA问题轻量级锁和重量级锁的效率探讨偏向锁锁升级锁在对象的位置
轻量级锁和重量级锁区别
看是否经过操作系统管理;轻量级锁jvm自己实现,重量级锁交由操作系统管理。
什么是CAS、重量级锁
compare and swap 轻量级锁,别称:自旋锁、无锁。CAS的操作具备原子性。 想象一个这样的场景:
一个班的学生共用一个厕所,有一个人抢到了去拉大号,把厕所门锁上了,其他学生只能原地转圈,等着里面的人出来,再去抢厕所,这个锁就是轻量级锁。线程间是while操作,所以是自旋。等着上厕所的人太多了,这个时候操作系统作为厕所所长介入了,让所有人排队,到谁通知谁,此时线程的状态是wait,这个由操作系统的管理的锁就是重量级锁。
轻量级锁的ABA问题
CAS一个线程操作改变一个数据的值时,会检查值和改变前的值是否一致,如果一致,修改成功;如果不一致,拿新值回去重新改。这样会产生一个问题,如果这个数被其他线程改过一次,又改回了原数据,应该怎么控制呢?这个就是ABA问题。解决办法:最常用的就是加version字段,修改后检查version是否一致。
轻量级锁和重量级锁的效率探讨
轻量级锁的线程过多自旋会占用cpu资源;线程执行任务的时间短、线程数量比较少,资源竞争不紧张的情况,适合用轻量级锁;反之适合用重量级锁。
偏向锁
长期的工程实践下来,发现锁竞争在70%-80%的场景下不会出现,比如vector、stringBuffer的syncronize方法,会阻碍执行效率。于是产生了这么一个机制,jvm将第一个执行的线程做一个标记即可,此时不进行锁竞争,但是也是一个锁的机制,称为偏向锁。顾名思义,偏向于第一个进来的线程。如果之后有其他线程进来,锁升级为轻量级锁、重量级锁。
锁升级
锁降级,只有vm thread能够触发锁降级,而此线程是gc线程,正在回收对象的锁降级没有意义,所以可以近似认为锁降级不存在。
锁在对象的位置
锁信息存放在对象的markword里。