锁优化的方式

锁优化分为代码层面的优化和jvm层面的优化

代码层面的锁优化的思路和方法

锁优化的方法有以下几种:

  1. 减少锁持有时间
  2. 减小锁粒度
  3. 锁分离
  4. 锁粗化
  5. 锁消除

减少锁持有时间
  减少其他线程等待的时间,所以,只需要在有线程安全要求的程序代码上加锁。举例:synchronized 同步方法块,而不是整个方法。

减小锁粒度
  指缩小锁定对象的范围,从而减少锁冲突的可能性,进而提高系统的并发能力。最典型的减小锁粒度的案例就是ConcurrentHashMap。

锁分离
  最常见的锁分离就是读写锁ReadWriteLock,根据功能进行分离成读锁和写锁,这样读读不互斥,读写互斥,写写互斥。既保证了线程安全,又提高了性能。
  在 LinkedBlockingQueue 的实现中,take()和put()函数分别从队列中取得数据和往队列中增加数据,JDK使用了两把不同的锁分离了这个两个操作,使得两者在真正意义上成为可并发的操作。

锁粗化
  虚拟机在遇到一连串连续对同一锁不断请求和释放的操作时,会把所有的锁操作整合成对锁的一次请求,从而减少对锁的请求同步数,这个操作叫做锁的粗化。

锁消除
  锁消除是在编译器级别的事情。如果发现不可能被共享的对象,则可以消除这些对象的锁操作。比如Vector和StringBuffer这样的类在JDK实现中就有锁,它们中的很多方法都是有锁的。当在一些不会有线程安全的情况下使用这些类的方法时,达到某些条件时,编译器会将锁消除来提高性能。

  开启锁消除是在JVM参数上设置的,当然需要在server模式下并且要开启逃逸分析:

-server -XX:+DoEscapeAnalysis -XX:+EliminateLocks

逃逸分析的作用就是看看变量是否有可能逃出作用域的范围。所以基于逃逸分析,JVM可以判断,如果这个局部变量StringBuffer并没有逃出它的作用域,那么可以确定这个StringBuffer并不会被多线程所访问,那么就可以把这些多余的锁给去掉来提高性能。

虚拟机内的锁优化

  在JVM中,每个对象都有一个对象头Mark Word,描述对象的hash、锁信息,垃圾回收标记,年龄还会保存指向锁记录的指针,指向monitor的指针,偏向锁线程ID等。

偏向锁
  某个同步块大多数情况都不会出现多线程同时竞争锁,所以可以通过偏向来提高性能,即在无竞争时,之前获得锁的线程再次获得锁时,会判断是否偏向锁指向自己,那么该线程将不用再次获得锁,直接就可以进入同步块。
  偏向锁的实施就是将对象头Mark的标记设置为偏向,并将线程ID写入对象头Mark 。当其他线程请求相同的锁时,偏向模式结束。JVM默认启用偏向锁 -XX:+UseBiasedLocking

轻量级锁
  轻量级锁利用了CAS。 如果偏向锁失败,那么系统会进行轻量级锁的操作,它存在的目的是尽可能不用动用操作系统层面的互斥。当偏向锁失败时,轻量级锁的步骤:
1.将对象头的Mark指针保存到锁对象中
2.将对象头设置为指向锁的指针(在线程栈空间中)
lock位于线程栈中。所以判断一个线程是否持有这把锁,只要判断这个对象头指向的空间是否在这个线程栈的地址空间当中。

自旋锁
  自旋锁可以使线程没有取得锁时,不被挂起,而转去执行一个空循环,在若干个空循环后,线程如果获得了锁,则继续执行,若线程依然没有获得锁,才会被挂起,避免用户线程和内核的切换的消耗。
  在JVM中使用-XX:UseSpinning参数来开启自旋锁,使用 -XX:PreBlockSpin来设置自旋锁的等待次数。

偏向锁,轻量级锁,自旋锁总结
  首先偏向锁是为了避免某个线程反复获得/释放同一把锁时的性能消耗,如果仍然是同个线程去获得这个锁,尝试偏向锁时会直接进入同步块,不需要再次获得锁。
  而轻量级锁和自旋锁都是为了避免直接调用操作系统层面的互斥操作,因为挂起线程是一个很耗资源的操作。
  为了尽量避免使用重量级锁,首先会尝试轻量级锁,轻量级锁会尝试使用CAS操作来获得锁,如果轻量级锁获得失败,说明存在竞争。但是也许很快就能获得锁,就会尝试自旋锁,将线程做几个空循环,每次循环时都不断尝试获得锁。如果自旋锁也失败,那么只能升级成重量级锁。
  可见偏向锁,轻量级锁,自旋锁都是乐观锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值