线程同步方法及服务器与流程

文档序号:14967464发布日期:2018-07-20 11:23阅读:195来源:国知局

本发明实施例涉及同步处理技术领域,特别涉及线程同步方法及服务器。



背景技术:

随着业务发展和性能瓶颈,多线程并发的使用越发频繁。有些时候,我们需要保证在同一个时间同一个资源只能由一个线程占用,所以我们引入了锁的机制来控制这些并发。

传统方式,我们针对每个资源(可以用key值表示)设立对应的锁,当线程执行的时候要先获取到该key值对应的锁,加锁成功然后才能执行该线程(即继续业务处理)。

发明人发现现有技术中至少存在如下问题:对每个key值都设立锁既繁琐又没法满足key值的增长及不确定的要求,比如针对订单的加锁(订单的数量是不确定)。



技术实现要素:

本发明实施方式的目的在于提供一种线程同步方法及服务器,只需要在资源被使用时才为其建立本地锁,可以适应资源增长及不确定的要求。

为解决上述技术问题,本发明的实施方式提供了一种线程同步方法,线程中预先配置有锁注解,包括:根据所述锁注解与所述线程的参数值,生成目标资源的资源名称;判断预设的锁池中是否存在所述资源名称对应的本地锁;若存在,则从所述锁池中获取所述本地锁;若不存在,则创建所述资源名称对应的本地锁,并将创建的所述本地锁放入所述锁池;尝试对所述本地锁进行加锁,并在所述本地锁被加锁成功后,所述线程占用所述目标资源并进入执行状态。

本发明的实施方式还提供了一种服务器,包括:至少一个处理器;以及,与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行上述线程同步方法。

本发明的实施方式还提供了一种计算机可读存储介质,存储有计算机程序,所述计算机程序被处理器执行时实现上述线程同步方法。

本发明实施方式相对于现有技术而言,线程中预先配置有锁注解;根据锁注解与线程的参数值,生成资源名称;若锁池中存在所述资源名称对应的本地锁,则从所述锁池中获取所述本地锁;若锁池中不存在所述资源名称对应的本地锁,则从创建所述资源名称对应的本地锁并将其放入所述锁池。即,预先为线程配置锁注解(表征要抢占的资源)并设定锁池;当需要抢占该锁注解对应的目标资源时(线程被触发时),才根据锁注解与线程的参数值生成资源名称;当锁池中不存在该资源名称对应的本地锁时,表示该资源为首次使用,则创建该资源名称对应的本地锁并放入锁池;从而,无需为每个资源预先设置本地锁,只需要在资源首次被使用时才为其创建本地锁,可以适应资源增长及不确定的要求。

另外,所述锁注解至少包括资源类别和资源身份变量;所述根据所述锁注解与所述线程的参数值,生成目标资源的资源名称,具体包括:将所述线程中的参数值赋值给所述资源身份变量;根据所述资源类别与赋值后的所述资源身份变量生成所述资源名称。本实施例提供了根据锁注解与线程的参数值生成目标资源的资源名称的一种具体方式。

另外,所述锁注解还包括加锁方式,所述尝试对所述锁进行加锁,具体为:根据所述锁注解中的所述加锁方式,尝试对所述本地锁进行加锁。本实施例的锁注解值还包括加锁方式,即还以根据预先在锁注解中设定加锁方式,作为后续加锁操作的加锁方式。

另外,所述本地锁被加锁成功之后,且在所述线程进入执行状态之前,还包括:获取所述资源名称对应的分布式锁;尝试对所述分布式锁进行加锁,并在所述分布式锁被加锁成功后,所述线程进入执行状态。本实施例中的线程同步方法可以应用于分布式系统,以在分布式系统中实现多个线程的同步。

另外,所述锁注解包括分布式锁需求;所述获取所述资源名称对应的分布式锁之前,还包括:根据所述锁注解中的分布式锁需求,判断所述目标资源是否需要获取分布式锁;若需要,则进入所述获取所述资源名称对应的分布式锁的步骤。本实施例中的锁注解中包括分布式锁需求,可以根据锁注解中预先设定的分布式锁需求判断目标资源是否需要获取分布式锁,目标资源是否需要获取分布式锁可以由设计人员根据需要预先设定(在锁注解中预先设定),设计十分灵活方便。

另外,所述本地锁包括加锁状态和加锁标识;所述本地锁被加锁成功,具体包括:所述加锁状态由未锁状态被修改为锁住状态,且所述加锁标识被修改为所述线程对应的标识信息。进一步的,在所述根据所述锁注解与所述线程的参数值生成目标资源的资源名称之前,还包括:从另一线程接收所述另一线程对应的标识信息;其中,将所述另一线程对应的标识信息作为所述线程对应的标识信息。即,本地锁中除了可以设定加锁状态,还可以设定加锁标识,从而在异步方式的业务处理中,将接收的另一线程对应的标志信息作为线程对应的标识信息,并赋值给本地锁的加锁标识,以供该另一线程通过查询所述本地锁的加锁状态和/或加锁标识判断该线程的执行情况,从而便于后续处理。

附图说明

一个或多个实施例通过与之对应的附图中的图片进行示例性说明,这些示例性说明并不构成对实施例的限定,附图中具有相同参考数字标号的元件表示为类似的元件,除非有特别申明,附图中的图不构成比例限制。

图1是根据本发明第一实施例的线程同步方法的流程图;

图2是根据本发明第一实施例的线程同步方法的具体流程图;

图3是根据本发明第二实施例的线程同步方法的流程图;

图4是根据本发明第三实施例的线程同步方法的流程图;

图5是根据本发明第四实施例的服务器的方框图。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合附图对本发明的各实施方式进行详细的阐述。然而,本领域的普通技术人员可以理解,在本发明各实施方式中,为了使读者更好地理解本申请而提出了许多技术细节。但是,即使没有这些技术细节和基于以下各实施方式的种种变化和修改,也可以实现本申请所要求保护的技术方案。

本发明的第一实施方式涉及一种线程同步方法,线程中预先配置有锁注解,该方法包括:根据锁注解与线程的参数值,生成目标资源的资源名称;判断预设的锁池中是否存在资源名称对应的本地锁;若存在,则从锁池中获取本地锁;若不存在,则创建资源名称对应的本地锁,并将创建的本地锁放入锁池;尝试对本地锁进行加锁,并在本地锁被加锁成功后,线程进入执行状态。

本实施方式相对于现有技术而言,线程中预先配置有锁注解;根据锁注解与线程的参数值,生成资源名称;若锁池中存在所述资源名称对应的本地锁,则从所述锁池中获取所述本地锁;若锁池中不存在所述资源名称对应的本地锁,则创建所述资源名称对应的本地锁并将其放入所述锁池。即,预先为线程配置锁注解(表征要抢占的资源)并设定锁池;当需要抢占该锁注解对应的目标资源时(线程被触发时),才根据锁注解与线程的参数值生成资源名称;当锁池中不存在该资源名称对应的本地锁时,表示该资源为首次使用,则创建该资源名称对应的本地锁并放入锁池;从而,无需为每个资源预先设置本地锁,只需要在资源首次被使用时才为其创建本地锁,可以适应资源增长及不确定的要求。

下面对本实施方式的线程同步方法的实现细节进行具体的说明,以下内容仅为方便理解提供的实现细节,并非实施本方案的必须,请参考图1。

本实施例的线程同步方法应用于服务器,然不限于此,凡是能实现本实施中所述方法的任何电子设备均可。以下均以应用于服务器为例进行说明。

本实施例中,对不能并行执行的多个线程(需要抢占同一资源)预先配置锁注解。锁注解包括资源类别、资源身份变量以及加锁方式。其中,锁注解可以由开发人员手动添加,也可以由服务器根据预设规则自动生成并添加上去。

服务器还预先设立一个锁池,锁池最初建立时,里面并不存在任何目标资源对应的本地锁,即服务器不会预先为各目标资源配置本地锁;服务器会在业务处理的过程中,为各目标资源创建本地锁,并将各目标资源对应的本地锁放入该锁池。具体的,在业务处理过程中,当某个目标资源首次被访问时,访问该目标资源的线程会为该资源创建一个本地锁,并将该目标资源对应的本地锁放入锁池中;下次当其他线程再次访问该资源时,可以从该锁池中获取该资源对应的本地锁。一般而言,被放入锁池中的本地锁会一直存在于锁池中;除非该目标资源后续不会再用到,服务器才会把锁池中该目标资源对应的本地锁清除掉。

步骤101,根据锁注解与线程的参数值,生成目标资源的资源名称。步骤101包括多个子步骤,其中图2是本实施例较为细化的具体流程图,请同时参考图1和图2。

子步骤1011,将线程中的参数值赋值给资源身份变量;

子步骤1012,根据资源类别与资源身份变量生成资源名称。

具体的说,服务器从该线程的该锁注解中提取资源类别和资源身份变量;并根据该线程中的参数值为资源身份变量赋值,然后,将资源类别与赋值后的资源身份变量整合生成资源名称。其中,服务器可以通过el表达式来实现步骤101。

本实施例中的线程同步方法可以应用于各种业务处理,以下以网购商品为例进行说明。在网购商品的过程中包括抢购商品并支付(可以理解为由一个线程实现),其中,抢购商品需要竞争锁资源(即竞争商品资源)。该线程中预先配置了锁注解,该锁注解包括商品型号(即资源类别)、商品编号变量(即资源身份变量)、阻塞式,商品型号用于表征是何种商品,商品编号变量用于唯一确定是哪一件商品。

例如,商品型号为rma,线程中的参数值(即商品编号)为sl011,将sl011赋值给商品编号变量,从而生成资源名称为rmasl01;其中,这里将商品型号和商品编号组合起来作为资源名称,这个例子中的组合方式只是作为一个示例,开发人员可以根据实际需要设定具体组合方式。

步骤102,判断预设的锁池中是否存在资源名称对应的本地锁;若是,则进入步骤103;若否,则进入步骤104。

服务器会先查询锁池中是否有该资源名称对应的本地锁。如果有的话,表示该目标资源之前被使用过(本次并非首次使用),则从该锁池中获取该资源名称对应的本地锁,即进入步骤103;具体的,服务器从锁池中获得的是该本地锁的地址指针,以便后续的加锁操作。

需要说明的是,由于本地锁是与目标资源相对应的,因此,本实施例中将目标资源的名称作为该目标资源对应的本地锁的名称,然并不以此为限。

步骤103,从锁池中获取本地锁。

步骤104,创建资源名称对应的本地锁,并将创建的本地锁放入锁池。

如果锁池中没有该资源名称对应的本地锁,表示该目标资源是首次被使用,就创建该资源名称对应的本地锁,并将创建的该本地锁放入锁池;具体的,服务器将该本地锁放入锁池后会获得该本地锁的地址指针。

一般而言,当创建了该资源名称对应的本地锁后,即可以将创建的该本地锁成功放入锁池中。但是,也有可能出现两个线程几乎同时想要使用该目标资源(且该目标资源是首次被使用)的情况:另一个线程在几乎相同的时间段中也在创建该资源名称对应的本地锁,且将创建的该本地锁放入锁池中;该线程与该另一个线程将各自创建的本地锁放入锁池的时间点稍有差异,且该另一个线程先于该线程将该本地锁放入锁池,那么该线程在将创建的本地锁放入锁池时就会放入失败,此时,该线程会放弃该创建的本地锁,并重新从该锁池获取该资源名称对应的本地锁,其中该线程重新从该锁池获取的本地锁即为该另一个线程放入锁池的本地锁。在上述情况下,步骤104可以具体分为如下多个步骤,请同时参考图1和图2。

步骤104-1,创建资源名称对应的本地锁;

步骤104-2,判断是否能够将创建的本地锁放入锁池;若是,进入步骤104-3;若否,则进入步骤104-4。

步骤104-3,将创建的本地锁放入锁池。

步骤104-4,放弃创建的本地锁;在步骤104-4之后,返回步骤103。

步骤105,尝试对本地锁进行加锁,并判断是否加锁成功。

尝试对该资源名称对应的本地锁进行加锁,其中,该资源名称对应的本地锁是从锁池获取的或者是新创建的。具体而言,锁注解中包含加锁方式,服务器会根据锁注解中的加锁方式,尝试对本地锁进行加锁;如果加锁方式为阻塞式,那么服务器会重复尝试加锁,直至加锁成功,然后进入步骤106;如果加锁方式是非阻塞式,那么服务器仅尝试加锁一次,若本次尝试后加锁失败,则判定为本地锁加锁失败,并结束本次操作;若本次尝试后加锁成功,则进入步骤106。

需要说明的是,本实施例中预先在锁注解中设定了加锁方式,然不以此为限,在其他例子中,服务器可以设定默认的加锁方式(此时锁注解中无需包含加锁方式)。

其中,本地锁包括加锁状态和加锁标识。当加锁状态为锁住状态时,表示该本地锁已经被锁定(即该本地锁对应的目标资源已经被占用),当加锁状态为未锁状态时,表示该本地锁对应的目标资源尚未被占用,可以被加锁。加锁标识为线程对应的标识信息,即加锁标识用于表示占用该本地锁的线程。本地锁被加锁成功,具体包括:本地锁中的加锁状态由未锁状态被修改为锁住状态,且加锁标识被修改为线程对应的标识信息。

需要说明的是,本地锁也可仅包含加锁状态,开发人员可以根据需要设定本地锁的具体内容。

步骤106,线程进入执行状态。加锁成功后,表示该线程成功占用该资源名称对应的目标资源,从而允许该线程进入执行状态,即该业务处理继续进行。

步骤107,当线程执行完毕时,对本地锁进行解锁。

对本地锁进行解锁,即为释放该锁资源;与加锁相对应的,对本地锁进行解锁包括将本地锁中的加锁状态由锁住状态修改为未锁状态,并将加锁标识清空。

其中,本实施例中的线程同步方法,服务器可以通过面向切面编程(aspectorientedprogramming,简称aop,)技术来实现。

本发明的第二实施方式涉及一种线程同步方法。第二实施方式与第一实施方式大致相同,主要改进之处在于:在本发明第二实施方式中,该线程同步方法还可以应用于分布式系统。

如图3所示为第二实施例的流程图,本实施例中的图3是在图1的基础上做出的调整,然不限于此,也可以在图2的基础上做出调整。

其中,步骤201~步骤205、步骤212、步骤213与第一实施例中的步骤101~步骤105、步骤106、步骤107分别大致相同,此处不再赘述,不同之处在于,锁注解还包括分布式锁需求,第二实施例中,在步骤205的判断结果为是时,还包括:

步骤206,根据锁注解中的分布式锁需求,判断目标资源是否需要获取分布式锁;若是,则进入步骤207;若否,则进入步骤211。

其中,锁注解中预先设定了分布式锁需求;服务器根据分布式锁需求判断目标资源是否需要获取分布式锁。在程序中,分布式锁需求可以用预设标志来表示,例如,采用dn来表示分布式锁需求,如果dn=yes,则表示需要获取分布式锁,若果dn=no,则表示不需要获取分布式锁。

步骤207,获取资源名称对应的分布式锁。

需要说明的是,由于分布式锁是与目标资源相对应的,因此,本实施例中将目标资源的名称作为该目标资源对应的分布式锁的名称,然并不以此为限。

步骤208,尝试对分布式锁进行加锁,并判断是否加锁成功;若加锁成功,则进入步骤209。

其中,步骤207与步骤208的实现方式,与现有技术中对分布式锁的获取和加锁方式类似,此处不再赘述。

步骤209,线程进入执行状态。其中,步骤209与步骤212相同。

步骤210,当线程执行完毕时,对分布式锁进行解锁。其中,服务器对分布式锁进行解锁的解锁方式,与现有技术中类似,此处不再赘述。

步骤211,对本地锁进行解锁。其中,步骤211与步骤213相同。

即,在目标资源需要获取分布式锁的情况下,当线程执行完毕时,先对分布式锁进行解锁,然后再对本地锁进行解锁。

相较于第一实施例而言,本实施例中的线程同步方法可以应用于分布式系统,以在分布式系统中实现多个线程的同步。其中,本实施例中的锁注解中包括分布式锁需求,服务器可以根据锁注解中预先设定的分布式锁需求判断目标资源是否需要获取分布式锁,目标资源是否需要获取分布式锁可以由设计人员根据需要预先设定(在锁注解中预先设定),设计十分灵活方便。然本实施例不限于此,在其他例子中,服务器内也可以以默认为目标资源需要获取分布式锁(此时锁注解中无需包含分布式锁需求)。

本发明的第三实施方式涉及一种线程同步方法。第三实施方式与第一实施方式大致相同,主要区别之处在于:本发明第三实施方式提供了在异步方式中的一种实现方式。

如图4所示为第二实施例的流程图,本实施例中的图4是在图1的基础上做出的调整,然不限于此,也可以在图2的基础上做出调整。

其中,步骤302~步骤308与第一实施例中的步骤101~步骤107分别大致相同,此处不再赘述,不同之处在于,第三实施例中,在步骤302之前,还包含:

步骤301,从另一线程接收另一线程对应的标识信息。其中,在对本地锁的加锁过程中,将另一线程对应的标识信息作为该线程对应的标识信息赋值给加锁标识,以供该另一线程查询该本地锁的加锁状态和/或加锁标识,从而根据该本地锁的加锁状态和/或加锁标识判断该线程的执行情况,决定是否要调用后续处理。其中,该另一线程可以定期心跳查询该本地锁的加锁状态和/或加锁标识;且较佳的,该另一线程会同时查询加锁状态和加锁标识,以根据加锁状态和加锁标识判断是否要调用后续处理。

例如,在第一实施例的网购商品的例子中(该线程用于实现抢购商品并支付),还包括另一线程,该另一线程用于实现页面请求。页面请求发起该网购商品的业务处理时(即另一线程触发该线程时),会将该页面请求对应的标识信息传送至该线程,该线程会将该页面请求对应的标识信息赋值给本地锁的加锁标识。从而,该页面请求可以定时查询该本地锁的加锁标识和加锁状态,若根据加锁标识和加锁状态判断出该线程已经执行结束,则可以执行后续操作,例如刷新页面以告知用户是否抢购并支付成功。其中,该页面请求根据该本地锁的加锁标识和加锁状态判断出该线程已经执行结束的具体方式,例如为,判断出加锁状态的本次查询结果与上次查询结果不同,且加锁标识的本次查询结果与上次查询结果不同。

相较于第一实施例,本实施例中的线程同步方法还可以应用于异步方式的后续处理中。另外需要说明的是,本实施例也可以是在第二实施例的基础上的改进,且起到的技术效果相同。

上面各种方法的步骤划分,只是为了描述清楚,实现时可以合并为一个步骤或者对某些步骤进行拆分,分解为多个步骤,只要包括相同的逻辑关系,都在本专利的保护范围内;对算法中或者流程中添加无关紧要的修改或者引入无关紧要的设计,但不改变其算法和流程的核心设计都在该专利的保护范围内。

本发明第四实施方式涉及一种服务器1,如图5所示,包括至少一个处理器11;以及与至少一个处理器11通信连接的存储器12;其中,存储器12存储有可被至少一个处理器11执行的指令,指令被所述至少一个处理器11执行,以使至少一个处理器11能够执行上述第一至第三实施例中任一实施例所述的线程同步方法。

其中,存储器12和处理器11采用总线方式连接,总线可以包括任意数量的互联的总线和桥,总线将一个或多个处理器11和存储器12的各种电路连接在一起。总线还可以将诸如外围设备、稳压器和功率管理电路等之类的各种其他电路连接在一起,这些都是本领域所公知的,因此,本文不再对其进行进一步描述。总线接口在总线和收发机之间提供接口。收发机可以是一个元件,也可以是多个元件,比如多个接收器和发送器,提供用于在传输介质上与各种其他装置通信的单元。经处理器11处理的数据通过天线在无线介质上进行传输,进一步,天线还接收数据并将数据传送给处理器11。

处理器11负责管理总线和通常的处理,还可以提供各种功能,包括定时,外围接口,电压调节、电源管理以及其他控制功能。而存储器12可以被用于存储处理器11在执行操作时所使用的数据。

本发明第五实施方式涉及一种计算机可读存储介质,存储有计算机程序。计算机程序被处理器执行时实现上述方法实施例。

即,本领域技术人员可以理解,实现上述实施例方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序存储在一个存储介质中,包括若干指令用以使得一个设备(可以是单片机,芯片等)或处理器(processor)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、磁碟或者光盘等各种可以存储程序代码的介质。

本领域的普通技术人员可以理解,上述各实施方式是实现本发明的具体实施例,而在实际应用中,可以在形式上和细节上对其作各种改变,而不偏离本发明的精神和范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1