【高并发程序设计】锁优化 A8站源码交易平台

摘要:轻量级锁胀大后, 虚拟机为了防止线程实在的在操作体系层面挂起, 还会做最终的尽力: 即锁自旋。当时线程无法获取到锁, 但或许在几个CPU时钟周期后, 就能够得到了。 根据这种假定, 虚拟时机让当时线程做几回获取锁的测验操作, 若能够获取到, 则履行临界区代码; 不然才会挂起线程

锁是最常用的同步办法之一。 在高并发环境下, 剧烈的锁竞赛会导致程序功用下降, 所以十分有必要讨论一下锁的功用问题以及相关的注意事项,如: 防止死锁、减小锁力度、锁别离等。

需求清晰一点, 多核场景下, 运用多线程尽管能够进步体系功用, 但一起也会添加额定的体系开支, 如保护线程自身的元数据、线程调度、上下文切换等。

1. 进步锁功用的主张
锁竞赛进程会导致体系功用下降, 为了将多线程的这种副作用降到最低, 有如下主张:

1.1 削减锁持有时刻
线程持有锁的时刻越长, 锁被竞赛的或许性就越大,竞赛也就更剧烈。 因而咱们在做程序规划时, 要尽或许削减线程持有锁的时刻,然后削减线程间互斥的或许性。

1.2 减小锁力度
即缩小确认目标的规模, 然后削减锁抵触的或许性,然后进步体系功用。

以HashMap和ConcurrentHashMap为例, HashMap进行put操作的时分, 是对整个目标加锁; 而ConcurrentHashMap是在其内部将大map分成了16个segment, 每个segement都能够了解成为一个小的HashMap, 各自持有各自的锁。 当进行put操作时,经过key的hashcode来确认详细在那个segment上, 然后对这个segement进行加锁然后履行put操作。 根据此, 多线程并发put的最佳状况是, ConcurrentHashMap能够支撑16个线程一起进行写入操作, 这大大进步了吞吐量。 A8站源码交易平台

当然, 任何事物都会有AB双面, 锁力度的减小, 也会带来相关的同步问题。A8站源码交易平台 即当想要获取大局信息时, 需求对一切子锁(segment)加锁后获取, 例如ConcurrentHashMap的size()办法。

1.3 经过读写别离来替换独占锁
这个很好了解, 读与读之间不互斥, 读与写之间做同步, 能够看成是减小锁力度的一种特殊状况,适用读多写少的场景,详细能够参阅ReadWriteLock。

1.4. 锁别离
将读写锁的思维进一步延伸, 即根据应用程序的详细特色, 运用相似的别离思维。 例如JUC中的LinkedBlockingQueue, 其内部关于take操作和put操作, 其根据Queue的操作特色(尾进头出), 别离设置了tack锁和put锁,然后完结了可一起对queue进行读写操作。

1.5 锁粗化
与削减锁持有时刻是相反的, 即在某些场景下, 能够经过兼并锁来削减锁获取、同步和开释次数, 削减对体系资源的糟蹋,然后提高体系功用。 一个典型的比如是, 将for循环中的锁挪到循环外。

 

2. 虚拟机对锁优化所做的尽力
锁存在目标头中, 因而在讨论JVM的锁优化前, 咱们先了解一下Hotspot虚拟机目标头的内存布局。目标头包含以下三部分:

Mark Word:  符号字段, 用于存储目标的运转时信息,如锁信息、代龄、hashCode、GC信息等, 占用一个字宽(4字节)
Klass Pointer:  类型指针,用于存储目标的类型信息), 占用一个字宽(4字节)
Array length: 数组长度, 只要当时目标是数组目标时才有
其间Mark Word是完结锁优化的要害, 其被规划成一个非固定的数据结构以便在极小的空间内存存储尽量多的数据,它会根据目标的状况复用自己的存储空间,也就是说,Mark Word会跟着程序的运转发生改变,A8站源码交易平台改变状况如下(32位虚拟机):


9181a4e2406b818ee68bb64f8188632.png


2.2 锁倾向
锁倾向是针对加锁操作的一种优化手法, 其中心思维是: 在无多线程竞赛的状况下, 尽量削减不必要的锁请求操作, 然后提高代码履行功率。 浅显点说, 若一个线程获取到了倾向锁, 在没有其他线程竞赛的状况下, 不管进入仍是退出同步代码块, 均布进行加锁/解锁操作, 乃至CAS操作都不进行。 JVM能够经过参数-XX:+UseBiasedLocking来启用倾向锁。 倾向锁的加锁解锁流程如下。

加锁
1). 检测Mark Word是否为可倾向状况,即 是否是倾向锁位为 1,锁标识位为 01; 
2). 若为可倾向状况,则测验线程ID是否为当时线程ID,假如是,则阐明当时线程持有倾向锁,履行过程5,不然履行过程3; 
3). 假如线程ID不为当时线程ID,则经过CAS操作竞赛锁,竞赛成功,将Mark Word的线程ID替换为当时线程ID,不然履行步驟4; 
4). 经过CAS竞赛锁失利,证明当时存在多线程竞赛状况,当抵达大局安全点(履行完结),取得倾向锁的线程被挂起,倾向锁晋级为轻量级锁,然后被阻塞在安全点的线程持续往下履行同步代码块; 
5). 履行同步代码块

解锁
倾向锁的开释采用了一种只要竞赛才会开释锁的机制,线程是不会自动去开释倾向锁,需求等候其他线程来竞赛。倾向锁的吊销需求等候大局安全点(这个时刻点是上没有正在履行的代码)。其过程如下: 
1). 暂停具有倾向锁的线程,判别锁目标石是否还处于被确认状况; 
2). 吊销倾向锁,康复到无锁状况(01)或许轻量级锁的状况;
 

2.3 轻量级锁
引进轻量级锁的首要意图是在没有多线程竞赛的前提下,削减传统的重量级锁运用操作体系互斥量发生的功用耗费。当封闭倾向锁功用或许多个线程竞赛倾向锁导致倾向锁晋级为轻量级锁,则会测验获取轻量级锁,其过程如下: 
加锁 
1. 判别当时目标是否处于无锁状况(hashcode、0、01),若是,则JVM首要将在当时线程的栈帧中树立一个名为锁记载(Lock Record)的空间,用于存储锁目标现在的Mark Word的复制(官方把这份复制加了一个Displaced前缀,即Displaced Mark Word);不然履行过程(3); 
2. JVM使用CAS操作测验将目标的Mark Word更新为指向Lock Record的纠正,假如成功表明竞赛到锁,则将锁标志位变成00(表明此目标处于轻量级锁状况),履行同步操作;假如失利则履行过程(3); 
3. 判别当时目标的Mark Word是否指向当时线程的栈帧,假如是则表明当时线程现已持有当时目标的锁,则直接履行同步代码块;不然只能阐明该锁目标现已被其他线程抢占了,这时轻量级锁需求胀大为重量级锁,锁标志位变成10,后边等候的线程将会进入阻塞状况;

解锁 
轻量级锁的开释也是经过CAS操作来进行的,A8站源码交易平台首要过程如下: 
1. 取出在获取轻量级锁保存在Displaced Mark Word中的数据; 
2. 用CAS操作将取出的数据替换当时目标的Mark Word中,假如成功,则阐明开释锁成功,不然履行(3); 
3. 假如CAS操作替换失利,阐明有其他线程测验获取该锁,则需求在开释锁的一起需求唤醒被挂起的线程。

关于轻量级锁,其功用提高的根据是“关于绝大部分的锁,在整个生命周期内都是不会存在竞赛的”,假如打破这个根据则除了互斥的开支外,还有额定的CAS操作,因而在有多线程竞赛的状况下,轻量级锁比重量级锁更慢;

2.4 自旋锁
轻量级锁胀大后, 虚拟机为了防止线程实在的在操作体系层面挂起, 还会做最终的尽力: 即锁自旋。当时线程无法获取到锁, 但或许在几个CPU时钟周期后, 就能够得到了。 根据这种假定, 虚拟时机让当时线程做几回获取锁的测验操作, 若能够获取到, 则履行临界区代码; 不然才会挂起线程;

2.5 锁消除
Java虚拟机在JIT编译时, 经过扫描上下文, 去除去不或许存在竞赛联系的锁。A8站源码交易平台


  • 全部评论(0)
最新发布的资讯信息
【A8站-免费源码分享|直播源码】直播系统源码开发:关于安卓开发工具和obs直播推流(2020-10-30 09:41)
【计算机/互联网|】【独家修复】用户定制版短视频点赞系统,支持抖音+快手+刷宝+微视等所有主流短视频评论系统源码(2020-10-26 16:34)
【技术宅-为技术而疯|网站架设教程】【独家首发】最新更新已对接短信2020全新抖音快手点赞任务系统霸屏天下小红书头条威客兼职完整搭建架设视频教程(2020-10-25 13:56)
【技术宅-为技术而疯|网站架设教程】最新可用个人发卡网系统源码完整搭建架设视频教程(2020-10-25 10:53)
【技术宅-为技术而疯|网站架设教程】独家更新全新V10抢单系统唯品会京东淘宝自动抢单区块系统源码全开源抢单收单接单返利+搭建架设完整视频教程(2020-10-25 10:52)
【计算机/互联网|】柔丫纸尿裤云仓系统源码部署(2020-10-15 18:13)
【计算机/互联网|】侏罗纪软件模式定制开发(2020-10-14 15:33)
【计算机/互联网|】S2b2C供应商系统 营销闭环(2020-10-10 17:46)
【计算机/互联网|程序设计开发】盛都汇系统奖励机制(2020-10-10 17:20)
【A8站-免费源码分享|网站源码】积分商城系统APP开发(2020-09-23 14:56)
联系我们
Q Q:3101359898 点击直接对话
电话:18580901894
邮箱:admin#a8zhan.com
时间:09:00 - 24:00
手机二维码 访问手机版
返回顶部