您的位置 首页 java

JAVA内部锁及开发过程中代码如何进行锁优化?面试如何回答?

JAVA 内部锁优化

针对内部锁的优化,主要有 锁消除、锁粗化、偏向锁、适应锁

锁消除: Java JIT 会通过逃逸分析的方式,去分析加锁的代码段或共享资源,他们是否被一个或者多个 线程 使用,没有其他的线程来竞争加锁,这个时候编译就不用加入 monitorenter monitorexit 的指令。这就是,仅仅一个线程争用锁的时候,就可以消除这个锁了,提升这段代码的执行的效率,因为可能就只有一个线程会来加锁,不涉及到多个线程竞争锁,如偏向锁。

锁粗化: 假设有几个在程序上相邻的同步块(代码段/共享资源)上,每个同步块使用的是同一个锁实例。那么JIT会在编译的时候将这些同步块合并成一个大同步块,并且使用同一个锁实例。这样避免一个线程反复申请/释放锁。 锁粗化默认是开启的 ,如果要关闭这个特性可以在 Java 程序的启动命令行中添加 虚拟机 参数”-XX:-EliminateLocks”

JAVA内部锁及开发过程中代码如何进行锁优化?面试如何回答?

偏向锁: 意思就是说monitorenter和monitorexit是要使用CAS操作加锁和释放锁的,开销较大,因此如果发现大概率只有一个线程竞争一个锁,那么会给这个锁维护一个偏好 (Bias) ,后面他加锁和释放锁,基于Bias来执行,不需要通CAS,性能会提升很多。如果有其他的线程来竞争这个锁,此时就会收回之前那个线程分配的那个Bias偏好。

偏向锁 只能在单个线程反复持有该锁的时候起效 其目的是为了避免相同线程获取同一个锁时,产生的线程切换,以及同步操作

偏向锁默认是开启的 ,如果要关闭这个特性,可以在 Java 程序的启动命令行中添加 虚拟机参数”-XX:-UseBiasedLocks”

适应锁 :当一个线程持申请锁时,该锁正在被其他线程持有。那么申请锁的线程会进入等待,等待的线程会被暂停,暂停的线程会产生上下文切换。由于上下文切换是比较消耗系统资源的,所以这种暂停线程的方式就是适应锁,比较适合线程处理时间较长的情况。

开发过程中代码如何进行锁优化?

1.减小锁的颗粒度: 比方说,你手上有一份数据,里面包含了多个子数据,你加锁,可以对一整块完整的大数据来加锁,别人只要访问这一大块数据,都会有锁的争用的问题。你也可以选择降低加锁的粒度,你仅仅对大块数据里的部分子数据加锁。

2.对标志位修改等可见性场景优先使用 volatile : 多线程 访问一些共享的变量或者数据,如果仅仅只是有一些线程会来写一个变量标志位,另外一个线程是来读取这个标志位的值,那么此时优先使用volatile。

3.数值递增场景优先使用Atomic原子类: 多线程都要写,再判断一下,如只是简单的数值累加或者变更数值的一些操作,建议大家可以用 Atomic原子类,CAS机制,无锁化,并发性要比 synchronized 好一些。

4.数据允许多副本场景优先使用 ThreadLocal : 如果你不需要多个线程共享读写一个数据的话,可以让每个线程保持一个本地变量的副本的话,那么你其实可以搞一个ThreadLocal,让每个线程都维护一个变量的副本,每个线程就操作自己本地的副本就可以。

5.读多写少需要加锁的场景优先使用 读写锁 : 多线程并发访问一块共享数据,就需要加锁了,优先考虑读写锁,实现方式可以看之前各种锁的实现视频。

6.尽可能减少线程对锁占用的时间: 尽量保证你加锁的时间是很短的,不要在加锁之后,执行一些磁盘文件读写、网络IO读写,导致锁占用的时间过于长。建议,加锁,尽量就是操作一下内存里的数据就可以了,不要在锁里面去执行一些耗时的一些操作,比如说执行数据库操作, SQL ,或者是别的一些东西,可能会导致占用锁的时间,就会导致线程并发的吞吐量大幅度的下降,并发能力就很弱,性能很差。

7.分段加锁机制: 线程可结合wait notifyAll来进行等待及释放锁,减少加锁时间及休眠未释放锁。

8.尽可能对不同功能分离锁的使用: 比如读写锁、阻塞队列,人家在实现源码的时候,就使用了两把锁,队头是一把锁,队列尾巴是一把锁,你从队列尾巴插进去是加的一把锁,从队头消费数据使用的是另外一把锁,入队和出队的操作,就不会因为锁产生冲突了。

9.避免在循环中重入加锁以及释放锁: 这样会增加加锁和释放锁的频繁操作,降低并发。

10.尽量减少高并发场景中线程对锁的争用: spring cloud 中的注册表的读写多级缓机制。

下节讲解: HashMap 相关底部原理、扩容流程及JDK1.8做了哪些优化?

文章来源:智云一二三科技

文章标题:JAVA内部锁及开发过程中代码如何进行锁优化?面试如何回答?

文章地址:https://www.zhihuclub.com/195297.shtml

关于作者: 智云科技

热门文章

网站地图