应该会点JVM(三)

锁的优化

锁的四种状态(从低到高,只能升级不能降级

无锁状态
偏向锁状态
轻量级锁状态
重量级锁状态


自旋锁和自适应自旋


同步互斥的时候会造成线程阻塞,而挂起线程和恢复线程需要转入内核态中完成
有时候往往共享数据的锁定状态只会持续很短一段时间,那么如果此时将互斥的线程挂起,等待下一次获得锁再恢复线程,这样的话效率不高
那么可以不讲线程立即挂起,而是让他自旋(循环)等待获得锁(这就是自旋锁),那么这样可以避免在一段很短的等待时间挂起和恢复线程的开销
也就说,不立刻将线程挂起,稍微自旋等一下,这样的话或许可以减少线程挂起和恢复的开销


锁消除


虚拟机即使编译器在运行的时候,同步代码被检测不存在共享数据竞争,那么锁会被消除。也就是说如果数据不会被其他线程访问到,那么我们没必要加锁


扫描二维码关注公众号,回复: 2149804 查看本文章

锁粗化


我们加锁的时候会尽量减小锁的粒度,减少竞争
而如果我们对同一个对象反复加锁和解锁,会造成性能损耗。
所以不如把锁的粒度加大


MarkWord与线程之间的操作过程


java对象头中的Mark Word默认存储对象的Hashcode、分代年龄和锁标志位
进入同步代码块的时候,当前线程的栈帧会建立一个名为锁记录的空间,用于存储锁对象MarkWord的拷贝


偏向锁


锁会偏向于第一个获得他的线程,如果后面锁没有被其他线程获取,那么持有偏向锁的线程永远不需要再进行同步


轻量级锁


传统的重量级锁需要使用系统互斥量来实现,而轻量级锁的意图是在没有多线程竞争的情况下,减少重量级锁的系统互斥量产生的性能消耗

重量级锁需要使用操作系统的互斥量(常常使用一个整型量,0表示解锁,而其他所有的值则表示加锁。通过互斥量使同一资源同时只允许一个访问者对其进行访问)来实现
轻量级锁依据大部分的锁在同步周期内不存在竞争,使用CAS操作避免使用互斥量的开销
偏向锁的则是在无竞争的情况下,连CAS操作都不做


猜你喜欢

转载自blog.csdn.net/lianhao19900202/article/details/78968035