分散式重锁降级制造技术

技术编号:25040575 阅读:16 留言:0更新日期:2020-07-29 05:31
本申请的实施例提供了一种锁操作方法,该锁操作方法运行在电子设备上,该电子设备上布置有第一对象,该第一对象是一段代码,该电子设备上布置有至少一个应用程序,该至少一个应用程序具有第一线程,第一线程持有第一对象的锁,该锁包括记录锁的状态的锁字,该锁操作方法包括在不暂停第一线程的条件下执行:步骤1,检查第一对象的锁的状态;步骤2,在第一对象的锁是重锁的条件下,判断是否有其他线程在等候第一对象的锁;步骤3,在步骤2中判断为无其他线程在等候第一对象的锁的条件下,将第一对象的锁降级。

【技术实现步骤摘要】
分散式重锁降级
本专利技术涉及计算机领域,尤其涉及一种锁操作方法和运行该锁操作方法的电子设备。
技术介绍
Java语言应用广泛,例如在采用J2EE的网络服务中,在移动终端中通常采用的安卓(android)操作系统中,在可运行在安卓操作系统或ios操作系统上的应用软件中,在富客户应用(richclientapplication)中等都可以使用Java语言进行开发,进而使得软件在Java运行环境中运行。Java一个特征是支持并行运行(parallelprocessing),也称为并发,即在一个时段内同时有多个程序或多个线程,它们中的一些可能要去访问相同的资源,例如同一个对象,从而产生了竞争。为了保证有序的运行,Java提供了基于对象的锁(lock)机制,同一时间内只有一个线程能够持有锁,而只有当该线程释放该锁后,别的线程才有可能再持有该对象的锁并且运行该对象包含的程序代码。其中一种用于竞争较为激烈情况下的锁被称为重锁(fatlock),其会导致较多的系统调用,从而产生较大的开销。并且对象一旦具有了重锁,是不会通过线程拿(obtain)锁和释放(release)锁取消的。换言之,如果没有特殊干预,这些对象将一直背负重锁,随着重锁对象数目增多以及在其生命周期中访问其的次数累积,伴随的系统调用给系统带来较大负担。而其中一些对象在具有重锁后可能已不再处于竞争状态,重锁对其不再必要。可以看出,需要一种锁降级(deflation)机制,将不必要存在的重锁降级,以降低系统负担,提高运行效率。目前,谷歌公司开发的ART(androidruntime)虚拟机提供一种在垃圾回收(garbagecollection,GC)中附带的锁降级机制。GC时会暂停运行时,即暂停由应用程序创建的线程。GC时集中锁降级的方式一方面不能解决两次GC之间重锁带来的不必要的系统负担问题,另一方面,GC时对线程的暂停给用户带来卡顿体验(根据GC清理范围的不同,单次GC耗时可达到几百毫秒)。因此暂停虚拟机是从保证用户流畅体验角度所不希望的,而过长间隔的GC从锁降级角度来讲又是低效的。
技术实现思路
本申请实施例提供一种分散式锁降级机制,其中,锁降级时机独立于GC,当前持锁线程在释放重锁时如果检测到对象该锁不再处于竞争中,就及时将重锁降级。一次锁降级耗时为纳秒级,用户感知不到。从而通过这种分散式锁降级机制一方面保证了不因锁降级而影响用户的流畅性体验,一方面及时规避不必要的重锁开销。为了达到上述目的,本申请实施例采用如下技术方案:第一方面,提供一种锁操作方法,该锁操作方法运行在电子设备上,该电子设备上布置有第一对象,该第一对象是一段代码,该电子设备上布置有至少一个应用程序,该至少一个应用程序具有第一线程,第一线程持有第一对象的锁,该锁包括记录锁的状态的锁字(lockword),该锁操作方法包括在不暂停第一线程的条件下执行:步骤1,检查第一对象的锁的状态;步骤2,在第一对象的锁是重锁的条件下,判断是否有其他线程在等候第一对象的锁;步骤3,在步骤2中判断为无其他线程在等候第一对象的锁的条件下,将第一对象的锁降级。java语言的程序在运行中,为了互斥而可以用synchronized关键字修饰对象,形式例如为synchronized(obj),其中obj即代表对象。针对synchronized语法,java编译器(JavaCompiler)会在其保护的代码段的开始和结束分别插入SyncEnterandSyncExit指令。java虚拟机或其他类似于java虚拟机的、将java语言转换为操作系统可懂的语言的运行机构针对SyncEnterandSyncExit指令会有相应的类似MonitorEnter和MonitorExit函数作为底层实现。线程在退出该保护代码段之前会在MonitorExit模块内释放锁。本实施例提供的锁操作方法正是运行在MonitorExit模块中。在执行本实施例提供的锁操作方法的过程中不需要如GC中那样将所有由应用程序创建的线程暂停。锁的状态包括重锁、轻锁和无锁。在一些实施方式中,将第一对象的锁降级包括将第一对象的锁转换为轻锁和转换为无锁。在一些实施方式中,步骤1、步骤2和步骤3是在MonitorExit模块中执行的。在一些实施方式中,步骤3中判断无其他线程在等候第一对象的锁的条件是没有用于wait、sleep等JavaMethod,也没有处于冲突状态,所述冲突状态指的是其他线程已经准备在该锁上阻塞。在一些实施方式中,锁操作方法还包括在MonitorEnter模块中执行:步骤4,判断当前对象的锁的状态;步骤5,在步骤4中判断锁的状态是重锁的条件下,检查锁的状态;步骤6,在步骤5中判断锁已经被降级为无锁的条件下,使第一线程针对第一对象的锁重新读取锁状态并走相应无锁流程;步骤7,在步骤5中判断锁未被降级为无锁的条件下,将重锁冲突标志加1;步骤9,在步骤7中将重锁冲突标志加1的条件下,将第一线程阻塞;步骤10,在第一线程获得第一对象的锁的条件下,将重锁冲突标志减1。无锁流程指的是当对象锁的状态为无锁时,访问它的线程应该走的流程。一般是线程获得锁,并且通过将自己的标识置入锁字(lockword)来将无锁变为轻锁。重锁冲突标志表示:对当前线程T1持有该重锁且准备降级时,若此时发现有其他线程T2已经先于T1进入了由自旋锁保护的代码段并准备在此重锁上冲突等待时,T2会设置该冲突标志,此时T1检测到就不做降级。在一些实施方式中,在步骤4和步骤5之间加自旋锁(spinlock)保护,在步骤9和步骤10之间取消自旋锁保护。加自旋锁进行保护的作用是,使得T2以外的其他线程暂时不能再进入自旋锁保护的代码块,代码块包括两块,一块是锁降级保护的代码段,一块是MonitorEnter中准备进入冲突等待的代码段。在一些实施方式中,锁操作方法还包括:在步骤2中还检查第一对象锁的锁字是否为哈希码;在步骤3中,在步骤2判断为无其他线程在等候第一对象的锁且锁字不是哈希码的条件下,检查重锁冲突标志是否为0,在为0的条件下,将第一对象的锁降级为无锁。第二方面,提供一种锁操作方法,该锁操作方法运行在电子设备上,该电子设备上布置有第一对象,该第一对象是一段代码,该电子设备上布置有至少一个应用程序,该至少一个应用程序具有第一线程,第一线程持有第一对象的锁,该锁包括记录锁的状态的锁字(lockword),该锁操作方法包括在不暂停第一线程的条件下执行:步骤1,检查重入次数是否为0;步骤2,在步骤1中判断重入次数为0的条件下,在重锁冲突标志为0的条件下将第一对象锁降级为无锁;步骤3,在步骤1中判断重入次数不为0的条件下,在重锁冲突标志为0的条件下将第一对象锁降级为轻锁。java语言的程序在运行中,为了互斥而可以用synchronized关键字修饰对象,形式例如为synchronized(obj),其中obj即代表对象。针对synchronized语法,java编译器(JavaCompiler)会在其保护的代码段的开始和结束分别插入SyncEnteran本文档来自技高网
...

【技术保护点】
1.一种锁操作方法,所述锁操作方法运行在电子设备上,所述电子设备上布置有第一对象,所述第一对象是一段代码,所述电子设备上布置有至少一个应用程序,所述至少一个应用程序具有第一线程,所述第一线程持有所述第一对象的锁,所述锁包括记录锁的状态的锁字,所述锁操作方法包括在不暂停所述第一线程的条件下执行:步骤1,检查所述第一对象的锁的状态;步骤2,在所述第一对象的锁是重锁的条件下,判断是否有其他线程在等候所述第一对象的锁;步骤3,在步骤2中判断为无其他线程在等候所述第一对象的锁的条件下,将所述第一对象的锁降级。/n

【技术特征摘要】
1.一种锁操作方法,所述锁操作方法运行在电子设备上,所述电子设备上布置有第一对象,所述第一对象是一段代码,所述电子设备上布置有至少一个应用程序,所述至少一个应用程序具有第一线程,所述第一线程持有所述第一对象的锁,所述锁包括记录锁的状态的锁字,所述锁操作方法包括在不暂停所述第一线程的条件下执行:步骤1,检查所述第一对象的锁的状态;步骤2,在所述第一对象的锁是重锁的条件下,判断是否有其他线程在等候所述第一对象的锁;步骤3,在步骤2中判断为无其他线程在等候所述第一对象的锁的条件下,将所述第一对象的锁降级。


2.根据权利要求1所述的锁操作方法,其特征在于,将所述第一对象的锁降级包括将所述第一对象的锁转换为轻锁和转换为无锁。


3.根据权利要求1至2中任一项所述的锁操作方法,其特征在于,所述步骤1、所述步骤2和所述步骤3是在MonitorExit模块中执行的。


4.根据上述权利要求中任一项所述的锁操作方法,其特征在于,所述步骤3中判断无其他线程在等候所述第一对象的锁的条件是没有其他线程已经在所述第一对象的锁上被阻塞或者调用了java方法wait或sleep。


5.根据上述权利要求中任一项所述的锁操作方法,其特征在于,所述锁操作方法还包括在MonitorEnter模块中执行:步骤4,判断所述第一对象的锁的状态;步骤5,在所述步骤4中判断所述锁的状态是重锁的条件下,检查所述锁的状态;步骤6,在所述步骤5中判断所述锁已经被降级为无锁的条件下,使所述第一线程针对所述第一对象的锁走无锁流程;步骤7,在所述步骤5中判断所述锁未被降级为无锁的条件下,将重锁冲突标志加1;步骤8,在所述步骤7中将所述重锁冲突标志加1的条件下,将所述第一线程阻塞;步骤9,在所述第一线程获得所述第一对象的锁的条件下,将所述重锁冲突标志减1。


6.根据上述权利要求中任一项所述的锁操作方法,其特征在于,所述锁操作方法还包括:在所述步骤2中还检查所述第一对象锁的锁字是否为哈希码;在所述步骤3中,在所述步骤2判断为无其他线程在等候所述第一对象的锁且所述锁字不是哈希码的条件下,检查所述重锁冲突标志是否为0,在为0的条件下,将所述第一对象的锁...

【专利技术属性】
技术研发人员:杨启彬秦巍张斌赵俊民朱金鹏
申请(专利权)人:华为技术有限公司
类型:发明
国别省市:广东;44

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1