CN111459462B - 分散式重锁降级 - Google Patents
分散式重锁降级 Download PDFInfo
- Publication number
- CN111459462B CN111459462B CN201910050640.6A CN201910050640A CN111459462B CN 111459462 B CN111459462 B CN 111459462B CN 201910050640 A CN201910050640 A CN 201910050640A CN 111459462 B CN111459462 B CN 111459462B
- Authority
- CN
- China
- Prior art keywords
- lock
- thread
- operation method
- condition
- electronic device
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
- G06F8/315—Object-oriented languages
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/45—Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/52—Program synchronisation; Mutual exclusion, e.g. by means of semaphores
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/52—Program synchronisation; Mutual exclusion, e.g. by means of semaphores
- G06F9/524—Deadlock detection or avoidance
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computing Systems (AREA)
- Stored Programmes (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本申请的实施例提供了一种锁操作方法,该锁操作方法运行在电子设备上,该电子设备上布置有第一对象,该第一对象是一段代码,该电子设备上布置有至少一个应用程序,该至少一个应用程序具有第一线程,第一线程持有第一对象的锁,该锁包括记录锁的状态的锁字,该锁操作方法包括在不暂停第一线程的条件下执行:步骤1,检查第一对象的锁的状态;步骤2,在第一对象的锁是重锁的条件下,判断是否有其他线程在等候第一对象的锁;步骤3,在步骤2中判断为无其他线程在等候第一对象的锁的条件下,将第一对象的锁降级。
Description
技术领域
本发明涉及计算机领域,尤其涉及一种锁操作方法和运行该锁操作方法的电子设备。
背景技术
Java语言应用广泛,例如在采用J2EE的网络服务中,在移动终端中通常采用的安卓(android)操作***中,在可运行在安卓操作***或ios操作***上的应用软件中,在富客户应用(rich client application)中等都可以使用Java语言进行开发,进而使得软件在Java运行环境中运行。
Java一个特征是支持并行运行(parallel processing),也称为并发,即在一个时段内同时有多个程序或多个线程,它们中的一些可能要去访问相同的资源,例如同一个对象,从而产生了竞争。为了保证有序的运行,Java提供了基于对象的锁(lock)机制,同一时间内只有一个线程能够持有锁,而只有当该线程释放该锁后,别的线程才有可能再持有该对象的锁并且运行该对象包含的程序代码。其中一种用于竞争较为激烈情况下的锁被称为重锁(fatlock),其会导致较多的***调用,从而产生较大的开销。并且对象一旦具有了重锁,是不会通过线程拿(obtain)锁和释放(release)锁取消的。换言之,如果没有特殊干预,这些对象将一直背负重锁,随着重锁对象数目增多以及在其生命周期中访问其的次数累积,伴随的***调用给***带来较大负担。而其中一些对象在具有重锁后可能已不再处于竞争状态,重锁对其不再必要。可以看出,需要一种锁降级(deflation)机制,将不必要存在的重锁降级,以降低***负担,提高运行效率。
目前,谷歌公司开发的ART(android runtime)虚拟机提供一种在垃圾回收(garbage collection,GC)中附带的锁降级机制。GC时会暂停运行时,即暂停由应用程序创建的线程。GC时集中锁降级的方式一方面不能解决两次GC之间重锁带来的不必要的***负担问题,另一方面,GC时对线程的暂停给用户带来卡顿体验(根据GC清理范围的不同,单次GC耗时可达到几百毫秒)。因此暂停虚拟机是从保证用户流畅体验角度所不希望的,而过长间隔的GC从锁降级角度来讲又是低效的。
发明内容
本申请实施例提供一种分散式锁降级机制,其中,锁降级时机独立于GC,当前持锁线程在释放重锁时如果检测到对象该锁不再处于竞争中,就及时将重锁降级。一次锁降级耗时为纳秒级,用户感知不到。从而通过这种分散式锁降级机制一方面保证了不因锁降级而影响用户的流畅性体验,一方面及时规避不必要的重锁开销。
为了达到上述目的,本申请实施例采用如下技术方案:
第一方面,提供一种锁操作方法,该锁操作方法运行在电子设备上,该电子设备上布置有第一对象,该第一对象是一段代码,该电子设备上布置有至少一个应用程序,该至少一个应用程序具有第一线程,第一线程持有第一对象的锁,该锁包括记录锁的状态的锁字(lockword),该锁操作方法包括在不暂停第一线程的条件下执行:步骤1,检查第一对象的锁的状态;步骤2,在第一对象的锁是重锁的条件下,判断是否有其他线程在等候第一对象的锁;步骤3,在步骤2中判断为无其他线程在等候第一对象的锁的条件下,将第一对象的锁降级。java语言的程序在运行中,为了互斥而可以用synchronized关键字修饰对象,形式例如为synchronized(obj),其中obj即代表对象。针对synchronized语法,java编译器(JavaCompiler)会在其保护的代码段的开始和结束分别***SyncEnter and SyncExit指令。java虚拟机或其他类似于java虚拟机的、将java语言转换为操作***可懂的语言的运行机构针对SyncEnter and SyncExit指令会有相应的类似MonitorEnter和MonitorExit函数作为底层实现。线程在退出该保护代码段之前会在MonitorExit模块内释放锁。本实施例提供的锁操作方法正是运行在MonitorExit模块中。在执行本实施例提供的锁操作方法的过程中不需要如GC中那样将所有由应用程序创建的线程暂停。锁的状态包括重锁、轻锁和无锁。
在一些实施方式中,将第一对象的锁降级包括将第一对象的锁转换为轻锁和转换为无锁。
在一些实施方式中,步骤1、步骤2和步骤3是在MonitorExit模块中执行的。
在一些实施方式中,步骤3中判断无其他线程在等候第一对象的锁的条件是没有用于wait、sleep等Java Method,也没有处于冲突状态,所述冲突状态指的是其他线程已经准备在该锁上阻塞。
在一些实施方式中,锁操作方法还包括在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编译器(Java Compiler)会在其保护的代码段的开始和结束分别***SyncEnter and SyncExit指令。java虚拟机或其他类似于java虚拟机的、将java语言转换为操作***可懂的语言的运行机构针对SyncEnter and SyncExit指令会有相应的类似MonitorEnter和MonitorExit函数作为底层实现。线程在运行了代码,要释放锁之前会进入MonitorExit模块。本实施例提供的锁操作方法正是运行在MonitorExit模块中。在执行本实施例提供的锁操作方法的过程中不需要如GC中那样将所有由应用程序创建的线程暂停。锁的状态包括重锁、轻锁和无锁。重入次数记录的是线程T1在未释放当前对象锁的条件下进入该对象的MonitorEnter模块的总次数。
在一些实施方式中,将第一对象的锁降级包括将第一对象的锁转换为轻锁和转换为无锁。
在一些实施方式中,步骤1、步骤2和步骤3是在MonitorExit模块中执行的。
在一些实施方式中,锁操作方法还包括在MonitorEnter模块中执行:步骤4,判断当前对象的锁的状态;步骤5,在步骤4中判断锁的状态是重锁的条件下,检查锁的状态;步骤6,在步骤5中判断锁已经被降级的条件下,重新获得锁状态,可能是无锁或轻锁;步骤7,在步骤5中判断锁未被降级的条件下,将重锁冲突标志加1;步骤9,在步骤7中将重锁冲突标志加1的条件下,将第一线程阻塞;步骤10,在第一线程获得第一对象的锁的条件下,将重锁冲突标志减1。重锁冲突标志表示:对当前线程T1持有该重锁且准备降级时,若此时发现有其他线程T2已经先于T1进入了由自旋锁保护的代码段并准备在此重锁上冲突等待时,T2会设置该冲突标志,此时T1检测到就不做降级。在一些实施方式中,在步骤4和步骤5之间加自旋锁(spinlock)保护,在步骤9和步骤10之间取消自旋锁保护。加自旋锁进行保护的作用是,使得T2以外的其他线程暂时不能再进入自旋锁保护的代码块,代码块包括两块,一块是锁降级保护的代码段,一块是MonitorEnter中准备进入冲突等待的代码段。
第三方面,提供一种电子设备,包括存储器,处理器以及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,处理器执行计算机程序时使得电子设备实现本申请第一方面和第二方面的任一实施形式的锁操作方法。
在一些实施方式中,电子设备实现锁操作方法,该锁操作方法运行在电子设备上,该电子设备上布置有第一对象,该第一对象是一段代码,该电子设备上布置有至少一个应用程序,该至少一个应用程序具有第一线程,第一线程持有第一对象的锁,该锁包括记录锁的状态的锁字(lockword),该锁操作方法包括在不暂停第一线程的条件下执行:步骤1,检查第一对象的锁的状态;步骤2,在第一对象的锁是重锁的条件下,判断是否有其他线程在等候第一对象的锁;步骤3,在步骤2中判断为无其他线程在等候第一对象的锁的条件下,将第一对象的锁降级。java语言的程序在运行中,为了互斥而可以用synchronized关键字修饰对象,形式例如为synchronized(obj),其中obj即代表对象。针对synchronized语法,java编译器(Java Compiler)会在其保护的代码段的开始和结束分别***SyncEnter andSyncExit指令。java虚拟机或其他类似于java虚拟机的、将java语言转换为操作***可懂的语言的运行机构针对SyncEnter and SyncExit指令会有相应的类似MonitorEnter和MonitorExit函数作为底层实现。线程在运行了代码,要释放锁之前会进入MonitorExit模块。本实施例提供的锁操作方法正是运行在MonitorExit模块中。在执行本实施例提供的锁操作方法的过程中不需要如GC中那样将所有由应用程序创建的线程暂停。锁的状态包括重锁、轻锁和无锁。
在一些实施方式中,在电子设备实现的锁操作方法中,将第一对象的锁降级包括将第一对象的锁转换为轻锁和转换为无锁。
在一些实施方式中,在电子设备实现的锁操作方法中,步骤1、步骤2和步骤3是在MonitorExit模块中执行的。
在一些实施方式中,在电子设备实现的锁操作方法中,步骤3中判断无其他线程在等候第一对象的锁的条件是没有用于wait、sleep等Java Method,也没有处于冲突状态,所述冲突状态指的是其他线程已经准备在该锁上阻塞。
在一些实施方式中,在电子设备实现的锁操作方法中还包括在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编译器(Java Compiler)会在其保护的代码段的开始和结束分别***SyncEnter and SyncExit指令。java虚拟机或其他类似于java虚拟机的、将java语言转换为操作***可懂的语言的运行机构针对SyncEnter and SyncExit指令会有相应的类似MonitorEnter和MonitorExit函数作为底层实现。线程在运行了代码,要释放锁之前会进入MonitorExit模块。本实施例提供的锁操作方法正是运行在MonitorExit模块中。在执行本实施例提供的锁操作方法的过程中不需要如GC中那样将所有由应用程序创建的线程暂停。锁的状态包括重锁、轻锁和无锁。重入次数记录的是线程T1在未释放当前对象锁的条件下进入该对象的MonitorEnter模块的总次数。
在一些实施方式中,在电子设备实现的锁操作方法中,将第一对象的锁降级包括将第一对象的锁转换为轻锁和转换为无锁。
在一些实施方式中,在电子设备实现的锁操作方法中,步骤1、步骤2和步骤3是在MonitorExit模块中执行的。
在一些实施方式中,在电子设备实现的锁操作方法中还包括在MonitorEnter模块中执行:步骤4,判断当前对象的锁的状态;步骤5,在步骤4中判断锁的状态是重锁的条件下,检查锁的状态;步骤6,在步骤5中判断锁已经被降级的条件下,重新读取锁状态,可能是轻锁或无锁;步骤7,在步骤5中判断锁未被降级的条件下,将重锁冲突标志加1;步骤9,在步骤7中将重锁冲突标志加1的条件下,将第一线程阻塞;步骤10,在第一线程获得第一对象的锁的条件下,将重锁冲突标志减1。重锁冲突标志表示:对当前线程T1持有该重锁且准备降级时,若此时发现有其他线程T2已经先于T1进入了由自旋锁保护的代码段并准备在此重锁上冲突等待时,T2会设置该冲突标志,此时T1检测到就不做降级。在一些实施方式中,在步骤4和步骤5之间加自旋锁(spinlock)保护,在步骤9和步骤10之间取消自旋锁保护。加自旋锁进行保护的作用是使得T2以外的其他线程暂时不能再进入自旋锁保护的代码块,代码块包括两块,一块是锁降级保护的代码段,一块是MonitorEnter中准备进入冲突等待的代码段。
第四方面,提供了一种计算机存储介质,包括计算机指令,当计算机指令在电子设备上运行时,使得电子设备执行本申请第一方面和第二方面的任一实施形式的锁操作方法。
在一些实施方式中,电子设备执行锁操作方法,该锁操作方法运行在电子设备上,该电子设备上布置有第一对象,该第一对象是一段代码,该电子设备上布置有至少一个应用程序,该至少一个应用程序具有第一线程,第一线程持有第一对象的锁,该锁包括记录锁的状态的锁字(lockword),该锁操作方法包括在不暂停第一线程的条件下执行:步骤1,检查第一对象的锁的状态;步骤2,在第一对象的锁是重锁的条件下,判断是否有其他线程在等候第一对象的锁;步骤3,在步骤2中判断为无其他线程在等候第一对象的锁的条件下,将第一对象的锁降级。java语言的程序在运行中,为了互斥而可以用synchronized关键字修饰对象,形式例如为synchronized(obj),其中obj即代表对象。针对synchronized语法,java编译器(Java Compiler)会在其保护的代码段的开始和结束分别***SyncEnter andSyncExit指令。java虚拟机或其他类似于java虚拟机的、将java语言转换为操作***可懂的语言的运行机构针对SyncEnter and SyncExit指令会有相应的类似MonitorEnter和MonitorExit函数作为底层实现。线程在运行了代码,要释放锁之前会进入MonitorExit模块。本实施例提供的锁操作方法正是运行在MonitorExit模块中。在执行本实施例提供的锁操作方法的过程中不需要如GC中那样将所有由应用程序创建的线程暂停。锁的状态包括重锁、轻锁和无锁。
在一些实施方式中,在电子设备执行的锁操作方法中,将第一对象的锁降级包括将第一对象的锁转换为轻锁和转换为无锁。
在一些实施方式中,在电子设备执行的锁操作方法中,步骤1、步骤2和步骤3是在MonitorExit模块中执行的。
在一些实施方式中,在电子设备执行的锁操作方法中,步骤3中判断无其他线程在等候第一对象的锁的条件是没有用于wait、sleep等Java Method,也没有处于冲突状态,所述冲突状态指的是其他线程已经准备在该锁上阻塞。
在一些实施方式中,在电子设备执行的锁操作方法中还包括在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编译器(Java Compiler)会在其保护的代码段的开始和结束分别***SyncEnter and SyncExit指令。java虚拟机或其他类似于java虚拟机的、将java语言转换为操作***可懂的语言的运行机构针对SyncEnter and SyncExit指令会有相应的类似MonitorEnter和MonitorExit函数作为底层实现。线程在运行了代码,要释放锁之前会进入MonitorExit模块。本实施例提供的锁操作方法正是运行在MonitorExit模块中。在执行本实施例提供的锁操作方法的过程中不需要如GC中那样将所有由应用程序创建的线程暂停。锁的状态包括重锁、轻锁和无锁。重入次数记录的是线程T1在未释放当前对象锁的条件下进入该对象的MonitorEnter模块的总次数。
在一些实施方式中,在电子设备执行的锁操作方法中,将第一对象的锁降级包括将第一对象的锁转换为轻锁和转换为无锁。
在一些实施方式中,在电子设备执行的锁操作方法中,步骤1、步骤2和步骤3是在MonitorExit模块中执行的。
在一些实施方式中,在电子设备执行的锁操作方法中还包括在MonitorEnter模块中执行:步骤4,判断当前对象的锁的状态;步骤5,在步骤4中判断锁的状态是重锁的条件下,检查锁的状态;步骤6,在步骤5中判断锁已经被降级的条件下,重新读取锁状态,可能是轻锁或无锁;步骤7,在步骤5中判断锁未被降级的条件下,将重锁冲突标志加1;步骤9,在步骤7中将重锁冲突标志加1的条件下,将第一线程阻塞;步骤10,在第一线程获得第一对象的锁的条件下,将重锁冲突标志减1。重锁冲突标志表示:对当前线程T1持有该重锁且准备降级时,若此时发现有其他线程T2已经先于T1进入了由自旋锁保护的代码段并准备在此重锁上冲突等待时,T2会设置该冲突标志,此时T1检测到就不做降级。在一些实施方式中,在步骤4和步骤5之间加自旋锁(spinlock)保护,在步骤9和步骤10之间取消自旋锁保护。加自旋锁进行保护的作用是,使得T2以外的其他线程暂时不能再进入自旋锁保护的代码块,代码块包括两块,一块是锁降级保护的代码段,一块是MonitorEnter中准备进入冲突等待的代码段。
第五方面,提供一种计算机程序产品,当计算机程序产品在计算机上运行时,使得计算机执行第一方面和第二方面的任一实施形式的锁操作方法。
附图说明
图1示出了本申请实施例提供的电子设备100的结构示意图。
图2示出了本发明实施例的电子设备100的软件结构框图。
图3示出了本申请实施例提供锁结构。
图4示出了本申请实施例提供轻锁和重锁机制。
图5A至5F示出了用户体验场景。
图6示出了本申请实施例提供的锁操作方法。
图7示出了本申请实施例提供的锁操作方法。
图8示出了本申请实施例提供的锁操作方法。
图9A和图9B示出了本申请实施例提供的锁操作方法。
图10示出了本申请实施例提供的锁操作方法。
图11示出了本申请实施例提供的锁操作方法。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行描述。其中,在本申请实施例的描述中,除非另有说明,“/”表示或的意思,例如,A/B可以表示A或B;本文中的“和/或”仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,在本申请实施例的描述中,“多个”是指两个或多于两个。
以下,术语“第一”、“第二”等仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”等的特征可以明示或者隐含地包括一个或者更多个该特征。在本申请实施例的描述中,除非另有说明,“多个”的含义是两个或两个以上。
为清楚阐述本申请实施例提供的一种Java重锁降级方法,首先将介绍一些后续实施例中可能会出现的概念。
操作***(operating system,OS),是管理计算机硬件和软件资源的***软件,为计算机程序提供公共服务。
运行时(runtime),又称运行环境(runtime environment)或者运行时***(runtime system),是把半编译或全编译的运行码在目标机器上运行的环境。本申请所称的运行时是Java运行时。
进程(process),是应用程序关于某数据集合上的一次运行活动,是操作***(例如安卓***)进行资源分配和调度的基本单位。每一个进程都会占用一块地址空间,应用程序以一个或多个进程的形式运行在操作***上,实现相应的功能。
线程(thread),是进程的一个实体,它是比进程更小的能独立运行的基本单位。线程可与同属一个进程的其他的线程共享该进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。
应用线程(application thread),是应用程序在运行中产生的线程,这些线程在创建后由运行时***挂在一个列表(list)上。
同步(synchronized),在java程序运行中,为了保证多线程并发而对对象采用互斥手段,使得同一代码段在同一时间里只被一个线程运行,以避免运行混乱。互斥的手段通常是添加synchronized关键字。Java语言层面的synchronized在被执行时会转换为更底层的监视器进入(monitor enter)和监视器退出(monitor exit),其中monitor enter布置在被保护代码头部,monitor exit布置在被保护代码尾部。这意味着,线程想要运行被添加了synchronized关键字的程序,就必须运行monitor enter以进入对象锁和运行monitorexit以退出对象锁。每个重锁(FatLock)会有自己的monitor标识,即前面提及的MonitorId。所有的monitor会被放在电子设备软件结构的同一个区域中,在一些实施形式中,电子设备中设有用于运行java程序的java虚拟机,则monitor可以存放在java虚拟机的一块特定区域中。
锁(lock),是保证同一时间内只有一个线程访问方法或变量的一种机制。在Java语言中,当一个线程访问一个对象、一段代码时,必须获取该对象所属的锁,否则该线程将等待(或阻塞),直到该锁被释放,并且成功获得该被释放的锁。也就是说,最多只有一个线程能够获得该锁,当线程A尝试去获得线程B持有的对象锁时,线程A必须等待或者阻塞,直到线程B释放这个锁后,线程A才能够获取该锁以访问相应的代码段。
轻锁(ThinLock),线程首次获得此锁时会将其状态由UnLock设置为ThinLock,此后该锁冲突不激烈,或者该线程有重入且其重入次数未超过轻锁LockWord中表示的最大值时此锁会一直保持轻锁状态。当该线程释放此ThinLock时,会将其状态设置为UnLock。
重锁(FatLock),当竞争比较激烈(竞争线程等待时调用sched_yield超过一定次数)、线程自重入次数超过该ThinLock表示的最大值或者调用了wait,sleep等Java方法时,该锁会由ThinLock升级为FatLock。
锁降级(deflation),是将重锁变为轻锁或者无锁。在本申请中也会为了上下文表述顺畅而将锁降级称为降级。
阻塞(block),通常指多线程执行共享代码段时,由于某个线程拿到锁,而其他线程在等待该锁释放而无法进入此代码段的情景。
垃圾回收(garbage collection,GC),是运行时中的garbage collection模块,对当前***中不使用的对象进行垃圾回收,减少***内存负担。ART的GC触发条件中包括:内存分配失败;显式调用System.gc()函数;对运行时中的堆(heap)做剪裁(trim)等。
应用程序(application,APP),是可以使得计算设备为计算设备的用户执行任务的应用软件。
system_server:是操作***中运行服务的一个进程,是基本服务的提供者和***运行的基本需求。system_server是中的命名,其他操作***中可能有其他命名,但是如果性质是操作***中运行服务的进程,是基本服务的提供者,则都在本申请的术语system_server的范围中。
本申请实施例提供的锁操作方法运行在电子设备上。本申请实施例提供的锁操作装置布置在电子设备中。对应于市场上的产品,电子设备可以对应于智能电话、便携式电话、游戏机、电视、显示单元、用于车辆的抬头显示单元、笔记本计算机、膝上型计算机、平板个人计算机(PC)、个人媒体播放器(PMP)器、个人数字助理(PDA),机顶盒等等。电子设备也可以实施为具有通信模块的通信终端,通信终端可以与诸如服务器等的外部电子设备通信,或者通过与外部电子设备交互工作来执行操作。只要是具有处理器和存储器,能够运行计算机指令的电子设备都可以运行本申请实施例提供的锁操作方法以及设有本申请实施例提供的锁操作装置。
为了便于理解本申请实施例提供的应用锁操作方法和应用锁操作装置,首先借助图1和图2简要介绍电子设备的示例性结构和电子设备的软件结构的示例性结构。
图1示出了本申请实施例提供的电子设备100的结构示意图。
电子设备100可以包括处理器110,其中处理器110中可以包括存储器。电子设备100还可以选地包括内部存储器121、外部存储器接口120,显示屏194、触摸传感器180K,USB接口130,充电管理模块140,电源管理模块141,电池142,天线1,天线2,移动通信模块150,无线通信模块160,音频模块170,扬声器170A,受话器170B,麦克风170C,耳机接口170D,传感器模块180,按键190,马达191,指示器192,摄像头193,以及SIM卡接口195等。其中传感器模块180可以包括压力传感器180A,陀螺仪传感器180B,气压传感器180C,磁传感器180D,加速度传感器180E,距离传感器180F,接近光传感器180G,指纹传感器180H,温度传感器180J,环境光传感器180L,骨传导传感器180M等。
可以理解的是,本发明实施例示意的结构并不构成对电子设备100的具体限定。在本申请另一些实施例中,电子设备100可以包括比图示更多或更少的部件,或者组合某些部件,或者拆分某些部件,或者不同的部件布置。图示的部件可以以硬件,软件或软件和硬件的组合实现。
处理器110可以包括一个或多个处理单元,例如:处理器110可以包括应用处理器(application processor,AP),调制解调处理器,图形处理器(graphics processingunit,GPU),图像信号处理器(image signal processor,ISP),控制器,存储器,视频编解码器,数字信号处理器(digital signal processor,DSP),基带处理器,和/或神经网络处理器(Neural-network Processing Unit,NPU)等。其中,不同的处理单元可以是独立的器件,也可以集成在一个或多个处理器中。
其中,控制器可以是电子设备100的神经中枢和指挥中心。控制器可以根据指令操作码和时序信号,产生操作控制信号,完成取指令和执行指令的控制。
处理器110中还可以设置存储器,用于存储指令和数据。在一些实施例中,处理器110中的存储器为高速缓冲存储器。该存储器可以保存处理器110刚用过或循环使用的指令或数据。如果处理器110需要再次使用该指令或数据,可从所述存储器中直接调用。避免了重复存取,减少了处理器110的等待时间,因而提高了***的效率。
在一些实施例中,处理器110可以包括一个或多个接口。接口可以包括集成电路(inter-integrated circuit,I2C)接口,集成电路内置音频(inter-integrated circuitsound,I2S)接口,脉冲编码调制(pulse code modulation,PCM)接口,通用异步收发传输器(universal asynchronous receiver/transmitter,UART)接口,移动产业处理器接口(mobile industry processor interface,MIPI),通用输入输出(general-purpose
input/output,GPIO)接口,用户标识模块(subscriber identity module,SIM)接口,和/或通用串行总线(universal serial bus,USB)接口等。
I2C接口是一种双向同步串行总线,包括一根串行数据线(serial data line,SDA)和一根串行时钟线(derail clock line,SCL)。在一些实施例中,处理器110可以包含多组I2C总线。处理器110可以通过不同的I2C总线接口分别耦合触摸传感器180K,充电器,闪光灯,摄像头193等。例如:处理器110可以通过I2C接口耦合触摸传感器180K,使处理器110与触摸传感器180K通过I2C总线接口通信,实现电子设备100的触摸功能。
I2S接口可以用于音频通信。在一些实施例中,处理器110可以包含多组I2S总线。处理器110可以通过I2S总线与音频模块170耦合,实现处理器110与音频模块170之间的通信。在一些实施例中,音频模块170可以通过I2S接口向无线通信模块160传递音频信号,实现通过蓝牙耳机接听电话的功能。
PCM接口也可以用于音频通信,将模拟信号抽样,量化和编码。在一些实施例中,音频模块170与无线通信模块160可以通过PCM总线接口耦合。在一些实施例中,音频模块170也可以通过PCM接口向无线通信模块160传递音频信号,实现通过蓝牙耳机接听电话的功能。所述I2S接口和所述PCM接口都可以用于音频通信。
UART接口是一种通用串行数据总线,用于异步通信。该总线可以为双向通信总线。它将要传输的数据在串行通信与并行通信之间转换。在一些实施例中,UART接口通常被用于连接处理器110与无线通信模块160。例如:处理器110通过UART接口与无线通信模块160中的蓝牙模块通信,实现蓝牙功能。在一些实施例中,音频模块170可以通过UART接口向无线通信模块160传递音频信号,实现通过蓝牙耳机播放音乐的功能。
MIPI接口可以被用于连接处理器110与显示屏194,摄像头193等***器件。MIPI接口包括摄像头串行接口(camera serial interface,CSI),显示屏串行接口(displayserial interface,DSI)等。在一些实施例中,处理器110和摄像头193通过CSI接口通信,实现电子设备100的拍摄功能。处理器110和显示屏194通过DSI接口通信,实现电子设备100的显示功能。
GPIO接口可以通过软件配置。GPIO接口可以被配置为控制信号,也可被配置为数据信号。在一些实施例中,GPIO接口可以用于连接处理器110与摄像头193,显示屏194,无线通信模块160,音频模块170,传感器模块180等。GPIO接口还可以被配置为I2C接口,I2S接口,UART接口,MIPI接口等。
USB接口130是符合USB标准规范的接口,具体可以是Mini USB接口,Micro USB接口,USB Type C接口等。USB接口可以用于连接充电器为电子设备100充电,也可以用于电子设备100与***设备之间传输数据。也可以用于连接耳机,通过耳机播放音频。该接口还可以用于连接其他电子设备,例如AR设备等。
可以理解的是,本发明实施例示意的各模块间的接口连接关系,只是示意性说明,并不构成对电子设备100的结构限定。在本申请另一些实施例中,电子设备100也可以采用上述实施例中不同的接口连接方式,或多种接口连接方式的组合。
充电管理模块140用于从充电器接收充电输入。
电子设备100的无线通信功能可以通过天线模块1,天线模块2移动通信模块150,无线通信模块160,调制解调处理器以及基带处理器等实现。
天线1和天线2用于发射和接收电磁波信号。电子设备100中的每个天线可用于覆盖单个或多个通信频带。
移动通信模块150可以提供应用在电子设备100上的包括2G/3G/4G/5G等无线通信的解决方案。在一些实施例中,移动通信模块150的至少部分功能模块可以被设置于处理器110中。在一些实施例中,移动通信模块150的至少部分功能模块可以与处理器110的至少部分模块被设置在同一个器件中。
调制解调处理器可以包括调制器和解调器。其中,调制器用于将待发送的低频基带信号调制成中高频信号。解调器用于将接收的电磁波信号解调为低频基带信号。随后解调器将解调得到的低频基带信号传送至基带处理器处理。
无线通信模块160可以提供应用在电子设备100上的包括无线局域网(wirelesslocal area networks,WLAN),蓝牙(bluetooth,BT),全球导航卫星***(globalnavigation satellite system,GNSS),调频(frequency modulation,FM),近距离无线通信技术(near field communication,NFC),红外技术(infrared,IR)等无线通信的解决方案。
电子设备100通过GPU,显示屏194,以及应用处理器等实现显示功能。GPU为图像处理的微处理器,连接显示屏194和应用处理器。GPU用于执行数学和几何计算,用于图形渲染。处理器110可包括一个或多个GPU,其执行程序指令以生成或改变显示信息。
显示屏194用于显示图像,视频等。显示屏194包括显示面板。显示面板可以采用LCD(liquid crystal display,液晶显示屏),OLED(organic light-emitting diode,有机发光二极管),有源矩阵有机发光二极体或主动矩阵有机发光二极体(active-matrixorganic light emitting diode的,AMOLED),柔性发光二极管(flex light-emittingdiode,FLED),Miniled,MicroLed,Micro-oLed,量子点发光二极管(quantum dot lightemitting diodes,QLED)等。在一些实施例中,电子设备100可以包括1个或N个显示屏,N为大于1的正整数。
外部存储器接口120可以用于连接外部存储卡,例如Micro SD卡,实现扩展电子设备100的存储能力。外部存储卡通过外部存储器接口120与处理器110通信,实现数据存储功能。例如将音乐,视频等文件保存在外部存储卡中。
内部存储器121可以用于存储计算机可执行程序代码,所述可执行程序代码包括指令。处理器110通过运行存储在内部存储器121的指令,从而执行电子设备100的各种功能应用以及数据处理。存储器121可以包括存储程序区和存储数据区。其中,存储程序区可存储操作***,至少一个功能所需的应用程序(比如声音播放功能,图像播放功能等)等。存储数据区可存储电子设备100使用过程中所创建的数据(比如音频数据,电话本等)等。此外,存储器121可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件,闪存器件,通用闪存存储器(universal flash storage,UFS)等。
触摸传感器180K,也称“触控面板”。触摸传感器180K可以设置于显示屏194,由触摸传感器180K与显示屏194组成触摸屏,也称“触控屏”。触摸传感器180K用于检测作用于其上或附近的触摸操作。触摸传感器可以将检测到的触摸操作传递给应用处理器,以确定触摸事件类型。可以通过显示屏194提供与触摸操作相关的视觉输出。在另一些实施例中,触摸传感器180K也可以设置于电子设备100的表面,与显示屏194所处的位置不同。
按键190包括开机键,音量键等。按键可以是机械按键。也可以是触摸式按键。电子设备100可以接收按键输入,产生与电子设备100的用户设置以及功能控制有关的键信号输入。
图2示出了本发明实施例的电子设备100的软件结构框图。
分层架构将软件分成若干个层,每一层都有清晰的角色和分工。层与层之间通过软件接口通信。在一些实施例中,将***分为四层,从上至下分别为应用程序层,应用程序框架层,安卓运行时(runtime)和***库,以及内核层。电子设备100的操作***(operating system,OS)包括应用程序框架层,安卓运行时和***库。
应用程序层可以包括一系列应用程序包。
如图2所示,应用程序包可以包括相机,图库,日历,通话,地图,导航,WLAN,蓝牙,音乐,视频,短信息等应用程序。
应用程序框架层为应用程序层的应用程序提供应用编程接口(applicationprogramming interface,API)和编程框架。应用程序框架层包括一些预先定义的函数。
如图2所示,应用程序框架层可以包括窗口管理器,内容提供器,视图***,电话管理器,资源管理器,通知管理器等。
窗口管理器用于管理窗口程序。窗口管理器可以获取显示屏大小,判断是否有状态栏,锁定屏幕,截取屏幕等。
内容提供器用来存放和获取数据,并使这些数据可以被应用程序访问。所述数据可以包括视频,图像,音频,拨打和接听的电话,浏览历史和书签,电话簿等。
视图***包括可视控件,例如显示文字的控件,显示图片的控件等。视图***可用于构建应用程序。显示界面可以由一个或多个视图组成的。例如,包括短信通知图标的显示界面,可以包括显示文字的视图以及显示图片的视图。
电话管理器用于提供电子设备100的通信功能。例如通话状态的管理(包括接通,挂断等)。
资源管理器为应用程序提供各种资源,比如本地化字符串,图标,图片,布局文件,视频文件等等。
通知管理器使应用程序可以在状态栏中显示通知信息,可以用于传达告知类型的消息,可以短暂停留后自动消失,无需用户交互。比如通知管理器被用于告知下载完成,消息提醒等。通知管理器还可以是以图表或者滚动条文本形式出现在***顶部状态栏的通知,例如后台运行的应用程序的通知,还可以是以对话窗口形式出现在屏幕上的通知。例如在状态栏提示文本信息,发出提示音,电子设备振动,指示灯闪烁等。
核心库包含两部分:一部分是java语言需要调用的功能函数,另一部分是安卓的核心库。
应用程序层和应用程序框架层运行在虚拟机中。虚拟机将应用程序层和应用程序框架层的java文件执行为二进制文件。虚拟机用于执行对象生命周期的管理,堆栈管理,线程管理,安全和异常的管理,以及垃圾回收等功能。
***库可以包括多个功能模块。例如:表面管理器(surface manager),媒体库(Media Libraries),三维图形处理库(例如:OpenGL ES),2D图形引擎(例如:SGL)等。
表面管理器用于对显示子***进行管理,并且为多个应用程序提供了2D和3D图层的融合。
媒体库支持多种常用的音频,视频格式回放和录制,以及静态图像文件等。媒体库可以支持多种音视频编码格式,例如:MPEG4,H.264,MP3,AAC,AMR,JPG,PNG等。
三维图形处理库用于实现三维图形绘图,图像渲染,合成,和图层处理等。
2D图形引擎是2D绘图的绘图引擎。
内核层是硬件和软件之间的层。内核层至少包含显示驱动,摄像头驱动,音频驱动,传感器驱动。
图3示出了本申请实施例提供的锁结构。一个java object会包括多个区域,例如包括对象头(Header)和实例数据(Instance Data)。Header通常包括对象自身的运行时数据,例如哈希码和UnLock,ThinLock,FatLock分类等。在本实施例中,在Header中留出32位(bit)作为锁字(lockword)区域。但是该lockword的区域不是专用的,也可能保存哈希码等其他信息,所以在读取和使用lockword信息的时候,应该先确认lockword的状态位。在另一些实施例中,可以将lockword的区域设置为专用的,则读取lockword时候无需再查询里面的内容是不是锁。
锁的类型包括无锁(unlock,也可写作UnLock等,不区分大小写)、轻锁(thinlock,也可写作ThinLock,不区分大小写)和重锁(fatlock,也可写作FatLock,不区分大小写)。类型是通过lockword的结构来体现的。
如图3所示,在无锁中,第一排是任意32bit的lockword,其中左起头两位代表锁状态(lock status)。第二排是无锁的状态。可以看到在无锁中,锁状态用00表示,剩余位都是0,在图中为了简洁写了剩余位的和为0,代表了剩余位都是0。
在轻锁中,第一排是任意32bit的lockword,其中左起头两位代表锁状态(lockstatus)。第二排是轻锁的状态。可以看到在轻锁中,锁状态用00表示,接下来两位空闲,是保留位,在另一些实施形式中也可以用于哈希标志等。剩余位划分成了重入次数(lockcount)和线程标识(thread id)。重入次数代表特定线程在未释放锁的条件下持续进入该锁的次数。线程标识记录的是当前持有该轻锁的线程ID。在该实施例中,分了12位给重入次数,16位给线程标识。在另一些实施例中,也可以分其他数目的位数给重入次数。
在重锁中,第一排是任意32bit的lockword,其中左起头两位代表锁状态。第二排是重锁的状态。可以看到在重锁中,锁状态用01表示,接下来两位空闲,是保留位,在另一些实施形式中也可以用于哈希标志等。剩余位分配给了监视器标识(MonitorId)。每个FatLock有自己的监视器。
图4示出了本申请实施例提供轻锁和重锁机制。一个对象的锁不能同时被一个以上的线程持有,即一个线程拿到对象锁之后,其他线程在它释放该锁之前无法获得该锁。如图4所示,根据T1持有锁的当前状态是轻锁还是重锁来解释T2如何等候该锁。
a)该锁的状态是轻锁
此时当一个线程T2阻塞在该锁上时,T2会通过调用sched_yield来出让cpu占有权,***会将该线程加到队尾,若没有比它优先级更高的线程,则此线程马上恢复执行,否则让其他线程占有cpu继续执行,T2重新得到cpu时会检测锁状态,若此时T1已经释放锁,T2获得此锁,此时只涉及上下文切换,开销很小,上下文切换指的是去排队时保存寄存器、信号等的状态,目的是切换回来的时候还能够正常执行流程。在该实施例中会计数在T1持有轻锁期间sched_yield被T2调用的次数,如果超过特定阈值,例如50次,说明该锁引起的竞争(contention)比较严重,因此会使得T2将该轻锁改成重锁,但重锁的持有者还是T1。
b)该锁的状态是重锁
如果该锁是重锁,则T2访问该锁时,会通过futex***调用进入内核并睡眠,内核执行复杂的调度算法,当T1释放锁时又会通过futex***调用唤醒被block的线程T2。整个过程不仅有上下文切换,还涉及到线程状态的改变、内核调度等昂贵的开销。此外,对于FatLock,其产生、销毁Monitor的操作也有开销。
如果能将生成的重锁在竞争不大的情况下降级为轻锁或无锁,可以节省***开销,使得被保护的代码段执行速度加快,进而提高电子设备的使用流畅度。已知的一种方法是在分配内存(Allocate Memory)、GC时统一将重锁降级。在例如在分配内存、GC时会针对内存做裁剪(trim),也包括重锁降级。执行锁降级前会将所有由应用程序创建的线程暂停,降级之后再恢复由应用程序创建的线程执行。此策略容易实现,但是缺陷是需要在暂停虚拟机运行中的由应用程序创建的线程时做,若此时积累了大量需要降级的重锁,则增大了停顿时间,破坏用户体验。而且GC发生的时间是难以预计的,因此难以在GC发生之前提醒用户卡顿即将发生。如图5A至5E所示,可能由于GC时的停顿而导致用户的不良体验。例如,如图5A所示,用户正在使用电子设备与一位社会地位较高的通话对象通电话。通话结束后,用户点击挂机,如图5B所示。接着用户将手机放入口袋,如图5C所示。用户以为挂机成功,于是用激烈的语言表达抒发了情绪,如图5D所示。可是点挂机的同时GC发生,包括通话应用线程在内的所有由应用程序创建的线程被暂停,挂机操作并没有被执行,如图5E所示。用户放到口袋中后GC结束,通话应用线程恢复,所以用户的激烈语言表达被电子设备采集,并且被通话对象听到,从而当用户发现后产生了对电子设备不良的使用体验。从该案例可以看出,如果能够通过不在GC时集中锁降级而缩短时间,会有助于避免用户对电子设备的不良体验。集中锁降级对GC的延长视GC时积累的重锁多少而定,如果GC前运行的线程多,例如在开机过程中,则锁降级耗时较久。锁降级对GC的延时可达到200ms左右。
图6示出了本申请实施例提供的锁操作方法。在电子设备中布置有对象A,例如是一段代码,由应用程序创建的线程T1正持有该对象A的锁。后文中为了表述清楚而可以将对象的锁简称为对象锁。如上文中提及过的,java语言的程序在运行中,为了互斥而可以用synchronized关键字修饰对象,形式例如为synchronized(obj),其中obj即代表对象。针对synchronized语法,java编译器(Java Compiler)会在其保护的代码段的开始和结束分别***SyncEnter and SyncExit指令。java虚拟机或其他类似于java虚拟机的、将java语言转换为操作***可懂的语言的运行机构针对SyncEnter and SyncExit指令会有相应的类似MonitorEnter和MonitorExit函数作为底层实现。线程在释放锁时会进入MonitorExit模块。本实施例提供的锁操作方法正是运行在MonitorExit模块中。在执行本实施例提供的锁操作方法的过程中不需要如GC中那样将所有由应用程序创建的线程暂停。
在不暂停所有由应用程序创建的线程的条件下,在步骤601中,检查锁的类型,如果判断为重锁,则执行步骤602,其中判断当前锁对应的对象(Object)没有用于wait、sleep等Java Method,也没有处于冲突状态(即其他线程已经准备在该锁上阻塞),则在步骤603中将锁降级。
步骤601中,可以通过lockword的结构来判断对象锁当前的状态。如果lockword具有如图3中重锁(Fatlock)的结构,即锁头两位是01,后28位是监视器标识,则将其判断为重锁。
在步骤603中,锁降级降级。锁降级包括降级为轻锁和无锁。
图7示出了本申请实施例提供的锁操作方法。电子设备中布置有对象A,例如是一段代码,由应用程序创建的线程T1正持有该对象A的锁,并且该锁的状态是重锁。T2来访问该对象,于是进入MonitorEnter模块,该实施例提供的锁操作方法运行在MonitorEnter模块中。在步骤701中,判断当前对象的锁状态重锁。具体措施是可以是读取lockword,通过其lockword头两位标识以及结构来判断是不是重锁,其含义是先判断是不是重锁,是重锁的情况下允许执行最后一个冒号后面的程序。在步骤702中,加自旋锁(spinlock)进行保护,使得T2以外的其他线程暂时不能再进入自旋锁保护的代码块,代码块包括两块,一块是锁降级保护的代码段,一块是MonitorEnter中准备进入冲突等待的代码段。在步骤703中,再次检查锁的状态,例如通过lw.GetState()函数来检查lockword从而得知锁状态。
如果在步骤703中检查结果是锁已经被降级,则在步骤704中将自旋锁取消,并且在步骤705中重新读取锁状态,这里可能是UnLock,也可能是ThinLock。
如果在步骤703中检查结果是锁未被降级,则在步骤706中将重锁冲突标志加1。重锁冲突标志表示:对当前线程T1持有该重锁且准备降级时,若此时发现有其他线程T2已经先于T1进入了Monitorenter中由自旋锁保护的代码段并准备在此重锁上冲突等待时,T2会设置该冲突标志,此时T1检测到就不做降级。在步骤707中取消自旋锁的保护。在步骤708中T2进入阻塞状态。一直到T2拿到该对象锁,它才会在步骤709中将重锁冲突标志减1。
在该实施例中,添加自旋锁保护的步骤702,以及取消自旋锁保护的步骤704和707是可选的。
该实施例的示例代码为:
图8示出了本申请实施例提供的锁操作方法。图8的锁操作方法和图7的锁操作方法作用于同一对象A。图8的锁操作方法在MonitorExit模块中运行。线程T1在释放锁时,于是走到了MonitorExit模块中。在步骤801中,T1检查是否有其他线程在等候该对象锁。例如检查有没有对于T1持有的重锁调用了wait、sleep等java函数的线程,以及没有重锁冲突标志。若没有则进入步骤802。在另一些实施形式中,在步骤801中还检查当前对象锁的lockword是不是被写成了哈希码。如果不是哈希码也没有等候线程则进入步骤802。在步骤802中,添加自旋锁保护,使得在T1执行本锁操作方法中接下来的步骤时,不会有其他线程能够执行由该自旋锁保护的代码段。在步骤803中,检查重锁冲突标志是不是为0。为0意味着没有其他线程在T1准备释放锁时进入了当前对象的MonitorEnter模块且准备阻塞等待。不为0则意味着有其他线程在先于T1降级进入了MonitorEnter中且准备在该重锁上阻塞等待。如果在步骤803中检查的结果是重锁冲突标志不为0,则在步骤804中取消自旋锁保护,该实施例中的锁操作方法流程结果。也就是没有将重锁降级。如果在步骤803中检查的结果是重锁冲突标志为0,则在步骤805中,将重锁降级为无锁。方法例如是将lockword置零。并且在步骤806中将自旋锁取消。在该实施例中,添加自旋锁的步骤802以及取消自旋锁的步骤804和806是可选的。该实施例的示例性代码为:
图9A和图9B示出了本申请实施例提供的锁操作方法。图9A和图9B的锁操作方法和图7的锁操作方法作用于同一对象A。图9A和图9B的锁操作方法在MonitorExit模块中运行。线程T1运行了对象A的代码后要释放锁,于是走到了MonitorExit模块中。首先看图9A,在步骤901中,检查当前对象锁的持有者标识是不是运行该锁操作方法的线程。如果当前对象锁的持有者标识不是运行该锁操作方法的线程,说明出错了,通过return函数结束该方法的流程。如果当前对象锁的持有者标识是运行该锁操作方法的线程,在步骤902中检查重入次数是否为0。重入次数记录的是线程T1在未释放当前对象锁的条件下进入该对象的MonitorEnter模块的总次数。Java程序中锁机制的一般运行规则是每走一次MonitorExit,重入次数会减1,一直到减到0,才允许持有锁的线程释放该锁。如果在步骤902中检查到重入次数为0,则在步骤903中将锁的持有者标识置零。在可选的步骤904中检查是否有线程在等候当前对象锁,并且在有线程等候的条件下唤醒等候的线程中的至少一个。如果在步骤902中检查到重入次数不为0,则在步骤905中将重入次数减1。在步骤904或步骤905之后走到步骤906,在步骤906中判断是否有线程已经在该锁上阻塞或者调用了wait,sleep Java方法。若存在则结束该锁操作方法的流程,即不将重锁降级就结束该锁操作方法。图9B示出了步骤907以及后续步骤。在步骤907中,判断锁持有者标识是否是0。如果在步骤907中判断锁持有者标识不是0,则在步骤908中加自旋锁保护。在步骤909中,在重锁冲突标志为0的条件下将重锁降级为轻锁。在步骤910中取消自旋锁的保护。如果在步骤907中判断锁持有者标识是0,则在步骤911中加自旋锁保护。在步骤912中,在重锁冲突标志为0的条件下将重锁降级为无锁。在步骤913中取消自旋锁的保护。在步骤910或步骤913后结束该锁操作方法的流程。添加自旋锁的步骤908和911以及取消自旋锁的步骤910和913是可选的。该实施例中的锁操作方法的示例代码为:
本申请图6、图8和图9A-B的实施例提供的锁操作方法使得能够在线程运行代码的流程中,动态地将没有竞争的重锁降级,每次降级的时间为毫秒级,于是将集中锁降级的大块时间随线程的动作而进行了分散,不会造成电子设备的卡顿,从而维护了用户顺畅的使用体验。例如,对运行有本申请实施例提供的锁操作方法的电子设备与运行有不带该锁操作方法的谷歌art***的电子设备进行比较。在采用synchronized关键字对对象obj进行修饰后,编译器会将SyncEnter和SyncExit***到对象的代码首尾,而SyncEnter和SyncExit分别对应底层的MonitorExit函数和MonitorExit函数实现。如下面的代码所示:
原始Java代码:
Statement1;//语句1
synchronized(obj){//用synchronized关键字对对象obj进行修饰
CodeSquence;//代码序列
}
Statement2;//语句2
经过编译synchronized变成对MonitorEnter和MonitorExit的调用:
Statement1;
MonitorEnter(obj){
CodeSquence;
}
MonitorExit(obj)
Statement2;
线程从Statement1到Statment2的执行时间,取决于锁的执行时间和被锁保护的代码序列的执行时间。在比较带有和不带有本申请实施例提供的锁操作方法的电子设备的性能时,主要比较锁降级的次数和重锁的数量,而不主要比较执行时间,因为编译器不同和***差异等会造成代码序列执行时间的差异。
测试开机时从Zygote、SystemServer启动到15秒、45秒和累计5分钟后分别针对运行原生Art的电子设备X和运行本申请实施例提供的锁操作方法的电子设备Y对比轻锁、重锁和锁降级次数:
1)15秒:
电子设备 | 轻锁数量 | 重锁数量 | 重锁降级次数 |
X | 574224 | 231660 | 0 |
Y | 700025 | 15699 | 2183 |
2)45秒:
电子设备 | 轻锁数量 | 重锁数量 | 重锁降级次数 |
X | 691128 | 285566 | 0 |
Y | 870103 | 18499 | 2850 |
3)累计5分钟:
从测试结果可以得出如下结论:
1)电子设备Y动态锁降级能够及时释放***压力,降级次数在3000次以上,电子设备X却没有执行锁降级,从而不能从重锁上释放***压力。电子设备Y产生的重锁相比较电子设备X产生的重锁减少三十万次以上,减少大量***开销;
2)从五分钟的数据来看电子设备X轻重锁总数为一百一十万左右,电子设备Y的轻重锁总数为一百零六万左右,总数是差不多的,说明锁对象的数目相当。电子设备Y的锁总数中有一百零四万是轻锁,只有不到两万是重锁。电子设备X的锁总数中近八十万是轻锁,三十二万是重锁。从轻重锁的比例上也说明了本申请实施例提供的锁操作方法能够及时将重锁降级且缓解***压力;
3)电子设备X中如在五分钟或更晚的时段上发生集中降级,会涉及到暂停、恢复运行时,可能导致严重卡顿。
图10示出了本申请实施例提供的锁操作方法。
当一个线程先于其他线程首次进入MonitorEnter时,便得到了锁,并将锁由初始状态(UnLock)改为ThinLock;
当此线程Reentry再次进入时,LockCount++;若此时LockCount已经超过能够表示的最大值,则将此锁由ThinLock升级为FatLock,
若此时其他线程进入且锁状态为ThinLock,则该线程sched_yield一定次数等待;若等待超过一定次数,则将此锁由ThinLock升级为FatLock;
若为哈希码,则进行升级或保存哈希标志(HashFlag);
在MonitorEnter FatLock场景中,在SpinLock保护下,重新读取LockWord并检测状态,若此时没有其他Thread Deflate,则设置Contention Flag,执行正常的Lock流程;lock函数是拿到锁或者等待。若已经被其他Thread Deflate,则重新走UnLock或ThinLock状态;退出SpinLock保护。
图11示出了本申请实施例提供的锁操作方法。
当线程进入且锁为UnLock状态,则出错,抛异常;
当线程进入且锁为ThinLock状态,则将LockCount--,若LockCount已经为0,则将锁置为UnLock状态;
当线程进入且锁为为哈希码,则进行升级或保存哈希码;
在MonitorExit->Unlock FatLock场景中;检测当前锁Wait Number为空,即没有用于wait、sleep等Java Method的线程,也没有处于冲突;统计Deflate Number,若达到一定次数;在SpinLock保护下,检测是否有其他Thread先于当前Thread Deflate的场景存在;若不存在,就执行FatLock到UnLock或ThinLock转换,降级(Deflate)完毕;退出SpinLock保护。
本申请的实施例还提供了一种电子设备,包括存储器,处理器以及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,处理器执行计算机程序时使得电子设备实现本申请任一实施例提供的锁操作方法。
本申请的实施例还提供了一种计算机存储介质,包括计算机指令,当计算机指令在电子设备上运行时,使得电子设备执行本申请任一实施例提供的锁操作方法。
本申请的实施例还提供了一种计算机程序产品,当计算机程序产品在计算机上运行时,使得计算机执行本申请任一实施例提供的锁操作方法。
上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品可以包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本申请实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户(DSL))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质(例如,软盘、硬盘、磁盘)、光介质(例如,DVD)、或者半导体介质(例如固态硬盘Solid State Disk(SSD))等。
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的***、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的***、装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个***,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器、随机存取存储器、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应所述以权利要求的保护范围为准。
Claims (12)
1.一种锁操作方法,所述锁操作方法运行在电子设备上,所述电子设备上布置有第一对象,所述第一对象是一段代码,所述电子设备上布置有至少一个应用程序,所述至少一个应用程序具有第一线程,所述第一线程持有所述第一对象的锁,所述锁包括记录锁的状态的锁字,所述锁操作方法包括在不暂停所述第一线程的条件下执行:步骤1,检查所述第一对象的锁的状态;步骤2,在所述第一对象的锁是重锁的条件下,判断是否有其他线程在等候所述第一对象的锁;步骤3,在步骤2中判断为无其他线程在等候所述第一对象的锁的条件下,将所述第一对象的锁降级。
2.根据权利要求1所述的锁操作方法,其特征在于,将所述第一对象的锁降级包括将所述第一对象的锁转换为轻锁和转换为无锁。
3.根据权利要求1至2中任一项所述的锁操作方法,其特征在于,所述步骤1、所述步骤2和所述步骤3是在MonitorExit模块中执行的。
4.根据权利要求1所述的锁操作方法,其特征在于,所述步骤3中判断无其他线程在等候所述第一对象的锁的条件是没有其他线程已经在所述第一对象的锁上被阻塞或者调用了java方法wait或sleep。
5.根据权利要求1所述的锁操作方法,其特征在于,所述锁操作方法还包括在MonitorEnter模块中执行:步骤4,判断所述第一对象的锁的状态;步骤5,在所述步骤4中判断所述锁的状态是重锁的条件下,检查所述锁的状态;步骤6,在所述步骤5中判断所述锁已经被降级为无锁的条件下,使所述第一线程针对所述第一对象的锁走无锁流程;步骤7,在所述步骤5中判断所述锁未被降级为无锁的条件下,将重锁冲突标志加1;步骤8,在所述步骤7中将所述重锁冲突标志加1的条件下,将所述第一线程阻塞;步骤9,在所述第一线程获得所述第一对象的锁的条件下,将所述重锁冲突标志减1。
6.根据权利要求1所述的锁操作方法,其特征在于,所述锁操作方法还包括:在所述步骤2中还检查所述第一对象锁的锁字是否为哈希码;在所述步骤3中,在所述步骤2判断为无其他线程在等候所述第一对象的锁且所述锁字不是哈希码的条件下,检查所述重锁冲突标志是否为0,在为0的条件下,将所述第一对象的锁降级为无锁。
7.一种锁操作方法,该锁操作方法运行在电子设备上,所述电子设备上布置有第一对象,所述第一对象是一段代码,所述电子设备上布置有至少一个应用程序,所述至少一个应用程序具有第一线程,所述第一线程持有所述第一对象的锁,所述锁包括记录锁的状态的锁字,所述锁操作方法包括在不暂停所述第一线程的条件下执行:步骤1,检查重入次数是否为0;步骤2,在所述步骤1中判断所述重入次数为0的条件下,在重锁冲突标志为0的条件下将所述第一对象的锁降级为无锁;步骤3,在所述步骤1中判断所述重入次数不为0的条件下,在所述重锁冲突标志为0的条件下将所述第一对象的锁降级为轻锁。
8.根据权利要求7所述的锁操作方法,其特征在于,将所述第一对象的锁降级包括将所述第一对象的锁转换为轻锁和转换为无锁。
9.根据权利要求7至8中任一项所述的锁操作方法,其特征在于,所述步骤1、所述步骤2和所述步骤3是在MonitorExit模块中执行的。
10.根据权利要求7至8中任一项所述的锁操作方法,其特征在于,所述锁操作方法还包括在MonitorEnter模块中执行:步骤4,判断所述第一对象的锁的状态;步骤5,在所述步骤4中判断所述锁的状态是重锁的条件下,检查所述锁的状态;步骤6,在所述步骤5中判断所述锁已经被降级的条件下,重新获得锁状态;步骤7,在所述步骤5中判断锁未被降级的条件下,将重锁冲突标志加1;步骤8,在步骤7中将所述重锁冲突标志加1的条件下,将所述第一线程阻塞;步骤9,在所述第一线程获得所述第一对象的锁的条件下,将所述重锁冲突标志减1。
11.一种电子设备,包括存储器,处理器以及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,处理器执行计算机程序时使得电子设备实现根据权利要求1至10中任一项所述的锁操作方法。
12.一种计算机存储介质,包括计算机指令,当计算机指令在电子设备上运行时,使得电子设备执行根据权利要求1至10中任一项所述的锁操作方法。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910050640.6A CN111459462B (zh) | 2019-01-20 | 2019-01-20 | 分散式重锁降级 |
PCT/CN2020/073102 WO2020147859A1 (zh) | 2019-01-20 | 2020-01-20 | 分散式重锁降级 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910050640.6A CN111459462B (zh) | 2019-01-20 | 2019-01-20 | 分散式重锁降级 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111459462A CN111459462A (zh) | 2020-07-28 |
CN111459462B true CN111459462B (zh) | 2023-05-09 |
Family
ID=71614132
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910050640.6A Active CN111459462B (zh) | 2019-01-20 | 2019-01-20 | 分散式重锁降级 |
Country Status (2)
Country | Link |
---|---|
CN (1) | CN111459462B (zh) |
WO (1) | WO2020147859A1 (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114296862B (zh) * | 2021-09-29 | 2024-06-28 | 苏州浪潮智能科技有限公司 | 一种基于JVM Markword的Synchronized锁降级方法、设备及介质 |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6247025B1 (en) * | 1997-07-17 | 2001-06-12 | International Business Machines Corporation | Locking and unlocking mechanism for controlling concurrent access to objects |
US6542891B1 (en) * | 1999-01-29 | 2003-04-01 | International Business Machines Corporation | Safe strength reduction for Java synchronized procedures |
US6546443B1 (en) * | 1999-12-15 | 2003-04-08 | Microsoft Corporation | Concurrency-safe reader-writer lock with time out support |
US6735760B1 (en) * | 2000-11-08 | 2004-05-11 | Sun Microsystems, Inc. | Relaxed lock protocol |
US6883026B1 (en) * | 1998-08-31 | 2005-04-19 | International Business Machines Corporation | Method and apparatus for managing locks of objects and method and apparatus for unlocking objects |
US7747996B1 (en) * | 2006-05-25 | 2010-06-29 | Oracle America, Inc. | Method of mixed lock-free and locking synchronization |
US7886300B1 (en) * | 2006-09-26 | 2011-02-08 | Oracle America, Inc. Formerly Known As Sun Microsystems, Inc. | Mechanism for implementing thread synchronization in a priority-correct, low-memory safe manner |
CN103246552A (zh) * | 2012-02-14 | 2013-08-14 | 腾讯科技(深圳)有限公司 | 防止线程出现阻塞的方法和装置 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP3575593B2 (ja) * | 1999-12-27 | 2004-10-13 | インターナショナル・ビジネス・マシーンズ・コーポレーション | オブジェクトのロック管理方法及び装置 |
US7823150B2 (en) * | 2005-01-25 | 2010-10-26 | International Business Machines Corporation | Computer-implemented method, system and program product for establishing multiple read-only locks on a shared data object |
-
2019
- 2019-01-20 CN CN201910050640.6A patent/CN111459462B/zh active Active
-
2020
- 2020-01-20 WO PCT/CN2020/073102 patent/WO2020147859A1/zh active Application Filing
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6247025B1 (en) * | 1997-07-17 | 2001-06-12 | International Business Machines Corporation | Locking and unlocking mechanism for controlling concurrent access to objects |
US6883026B1 (en) * | 1998-08-31 | 2005-04-19 | International Business Machines Corporation | Method and apparatus for managing locks of objects and method and apparatus for unlocking objects |
US6542891B1 (en) * | 1999-01-29 | 2003-04-01 | International Business Machines Corporation | Safe strength reduction for Java synchronized procedures |
US6546443B1 (en) * | 1999-12-15 | 2003-04-08 | Microsoft Corporation | Concurrency-safe reader-writer lock with time out support |
US6735760B1 (en) * | 2000-11-08 | 2004-05-11 | Sun Microsystems, Inc. | Relaxed lock protocol |
US7747996B1 (en) * | 2006-05-25 | 2010-06-29 | Oracle America, Inc. | Method of mixed lock-free and locking synchronization |
US7886300B1 (en) * | 2006-09-26 | 2011-02-08 | Oracle America, Inc. Formerly Known As Sun Microsystems, Inc. | Mechanism for implementing thread synchronization in a priority-correct, low-memory safe manner |
CN103246552A (zh) * | 2012-02-14 | 2013-08-14 | 腾讯科技(深圳)有限公司 | 防止线程出现阻塞的方法和装置 |
Also Published As
Publication number | Publication date |
---|---|
WO2020147859A1 (zh) | 2020-07-23 |
CN111459462A (zh) | 2020-07-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
WO2022262530A1 (zh) | 内存管理的方法及电子设备 | |
WO2021057643A1 (zh) | 一种多线程同步方法及电子设备 | |
US11526440B2 (en) | Providing multiple memory modes for a processor including internal memory | |
US10649889B2 (en) | Method and apparatus for managing kernel memory of data processing systems | |
WO2022199509A1 (zh) | 应用执行绘制操作的方法及电子设备 | |
KR20150066083A (ko) | 전자 장치의 멀티 태스킹 방법 및 그 전자 장치 | |
US8782674B2 (en) | Wait on address synchronization interface | |
EP3971818A1 (en) | Picture processing method and apparatus | |
CN115629884B (zh) | 一种线程调度方法、电子设备及存储介质 | |
WO2021169379A1 (zh) | 权限复用方法、基于权限复用的资源访问方法及相关设备 | |
CN115292199B (zh) | 一种显存泄露的处理方法及相关装置 | |
WO2023051355A1 (zh) | 权限检查的方法和电子设备 | |
CN118276722A (zh) | 窗口的显示方法和电子设备 | |
WO2023202429A1 (zh) | 垃圾回收的方法及电子设备 | |
CN115794361A (zh) | 管理内存的方法和电子设备 | |
CN111459462B (zh) | 分散式重锁降级 | |
CN117707716A (zh) | 线程调度方法、电子设备及计算机可读存储介质 | |
RU2635255C2 (ru) | Системный когерентный кэш с возможностью фрагментации/дефрагментации | |
CN116450473A (zh) | 踩内存问题的定位方法和电子设备 | |
US11074200B2 (en) | Use-after-free exploit prevention architecture | |
WO2023185684A1 (zh) | 一种应用程序的进程查杀方法及电子设备 | |
CN115620660B (zh) | 基于帧数据的显示驱动方法、电子设备及存储介质 | |
WO2023061014A1 (zh) | 任务管理方法及装置 | |
CN117094876A (zh) | 数据处理的方法、电子设备及可读存储介质 | |
CN116225632A (zh) | 线程调度方法、设备及相关装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |