java锁分段_java 锁分解 锁分段

首先大家想一想,为什么要有锁分解,锁分段技术。

他们是用来解决什么的

前提:

在并发程序中,对可伸缩性的最主要威胁就是独占方式的资源锁。

可伸缩性

指的是: 当增加计算资源时(例如CPU,内存,存储容器或者IO带宽),程序的吞吐量或者处理能力会相应地增加。

串行操作会降低可伸缩性,并且上下文切换也会降低性能。在锁上发生竞争时将同时导致这两种问题,因此减少锁的竞争能够提高性能和可伸缩性。

有两个因素将影响在锁上发生竞争的可能性:锁的请求频率,以及每次持有该锁的时间。如果两者的乘积很小,那么大多数获取锁的操作都不会发生竞争,因此在该锁上的竞争不会对可伸缩性造成严重影响。然而,如果在锁上的请求量很高,那么需要获取该锁的线程将被阻塞并等待。

有3种方式可以降低锁的竞争程度。

减少锁的持有时间

降低锁的请求频率

使用带有协调机制的独占锁,这些机制允许更高的并发性。

那么答案来了。锁分解,锁分段技术能够降低线程请求锁的频率。

设想一下,如果在整个应用程序中只有一个锁,而不是为每个对象分配一个独立的锁,那么所有同步代码块的执行就会变成串行化执行,而不考虑各个同步快中的锁。

下面是书中的一个例子, 是用锁分解技术来优化

未优化前:

9d2ccccec9d0738e216dec07eae2626f.png

优化后

b80b5a35676ddeb1da69d97875724fff.png

370902be7874b5d470aca7a8a4998b40.png

锁分解技术只适用于在锁上存在适中而不是激烈的竞争时,

锁分段:

如上面的例子,把一个竞争激烈锁分解为两个锁时,这两个锁可能都存在激烈的竞争,虽然采用两个线程并发执行能提高一部分的可伸缩性,但在一个拥有多个处理器的系统中,仍然无法给可伸缩性带来极大的提高。

这时候,有另一种方法: 锁分段技术。在某些情况下,可以将锁分解技术进一步扩展为对一组独立对象上的锁进行分解,这种情况就被称为锁分段。例如jdk1.8之前的concurrentHashMap。

ConcurrentHashMap中有16个锁的数组,每个锁保护一个数组,16个数组彼此独立,在这里大家可以思考一下,是不是跟上面锁分解技术很像,只不过是另一种形式,

锁分段有一个劣势:

e85f8bf4621c24a618a4646fd2a6487b.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值