首页> 中国专利> 一种分布式系统中多线程同步的方法和系统

一种分布式系统中多线程同步的方法和系统

摘要

本发明提供一种分布式系统中多线程同步的方法和系统,能够支持自定义条件对线程同步的灵活控制,做到线程主动释放资源以及精确唤醒相关等待线程,资源利用率高。本发明的分布式系统中多线程同步的方法包括:接收线程的资源控制请求,所述请求具有参数,所述参数包括所述线程的标识和所请求资源的资源名;根据所述资源名读取所述资源的资源节点的数据;尝试锁定所述资源,其中当锁定失败,把该线程的标识置于该资源的等待队列以使得该线程进入阻塞状态,当锁定成功,则该线程控制该资源,并且待所述线程利用所述资源完成执行后,释放所述资源,并唤醒该资源的等待队列中的其他线程,其中被唤醒的线程能够尝试锁定所述资源。

著录项

  • 公开/公告号CN105700939A

    专利类型发明专利

  • 公开/公告日2016-06-22

    原文格式PDF

  • 申请/专利号CN201610256779.2

  • 发明设计人 魏亚文;孙政;

    申请日2016-04-21

  • 分类号G06F9/46(20060101);G06F9/50(20060101);G06F9/52(20060101);G06F9/54(20060101);

  • 代理机构11219 中原信达知识产权代理有限责任公司;

  • 代理人张一军;姜劲

  • 地址 100195 北京市海淀区杏石口路65号西杉创意园四区11C楼东段1-4层西段1-4层

  • 入库时间 2023-12-18 15:45:39

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2019-07-02

    授权

    授权

  • 2016-07-20

    实质审查的生效 IPC(主分类):G06F9/46 申请日:20160421

    实质审查的生效

  • 2016-06-22

    公开

    公开

说明书

技术领域

本发明涉及计算机及其软件技术领域,特别地涉及一种分布式系 统中多线程同步的方法和系统。

背景技术

当使用多个线程来访问同一个数据时,非常容易出现安全问题, 例如:多个线程都在操作同一数据导致数据不一致的问题等。因此, 我们需要用同步机制来解决这些问题,也就是线程同步。线程同步是 指在多个线程同时访问同一资源的时候,需要保证该资源每次只能被 一个线程独占。现在主流的做法是对数据分块,达到数据隔离。但是, 有些应用不得不利用分布式系统中的线程同步。

在分布式系统中,由于应用程序部署在不同的机器上,而在不同 机器之间,程序无法共享使用内存信息,所以不同机器的多个线程间 的同步是困难的。因此,分布式同步是程序开发的时候尽量需要避免 的。

现有的分布式系统中线程同步的方法主要是,所有线程都通过指 定的缓存中间件(或者数据库)来修改指定资源记录的占有状态,这 些中间件本身是具有原子性。当多个线程同时去修改某个资源状态的 时候,最多只有一个线程能够修改成功。此处,修改成功的就可以被 认为是抢占资源成功。

然而,现有的分布式系统中线程同步的方法具有如下的缺陷:

1、所有线程都是通过主动轮询的方式来查询是否可以访问资源, 效率低;并且当资源被释放后,缺少通知同步线程的机制;

2、不支持灵活自定义的多条件的线程同步,即:各个线程可根据 自定义的条件主动选择阻塞或者根据自定义的条件唤醒相应的线程。

发明内容

有鉴于此,本发明提供一种分布式系统中多线程同步的方法和系 统,通过异步监听实现分布式系统中的多线程同步,能够支持自定义 条件对线程同步的灵活控制,做到线程主动释放资源以及精确唤醒相 关等待线程,资源利用率高。

为实现上述目的,根据本发明的一个方面,提供了一种分布式系 统中多线程同步的方法。

一种分布式系统中多线程同步的方法,包括:接收线程的资源控 制请求,所述请求具有参数,所述参数包括所述线程的标识和所请求 资源的资源名;根据所述资源名读取所述资源的资源节点的数据;尝 试锁定所述资源,其中当锁定失败,把该线程的标识置于该资源的等 待队列以使得该线程进入阻塞状态,当锁定成功,则该线程控制该资 源,并且待所述线程利用所述资源完成执行后,释放所述资源,并唤 醒该资源的等待队列中的其他线程,其中被唤醒的线程能够尝试锁定 所述资源。

可选地,读取所述资源的资源节点的数据的步骤包括:当所述资 源存在,则直接获取所述资源的资源节点,否则根据所述资源名创建 相应的资源节点,并读取所述资源节点的数据。

可选地,读取所述资源的资源节点的数据之后,还包括:对所述 资源进行校验,以确定所述资源有效且未被锁定。

可选地,还包括:通过在所述资源节点下创建资源锁定节点来锁 定所述资源,并通过删除所述资源锁定节点来释放所述资源。

可选地,所述资源节点下包含如下部分,其中,同步队列,所述 同步队列包括等待控制所述资源的线程;占用线程,所述占用线程是 当前控制所述资源的线程;自定义条件集合,所述自定义条件集合中 的每个条件具有等待队列。

可选地,线程在控制所述资源后,如果发现所述自定义条件集合 中的条件不满足,则释放所述资源并进入阻塞状态,且该线程的标识 被置于该条件的等待队列。

可选地,当所述自定义条件集合中的条件满足后,把该条件的等 待队列中的线程从该条件的等待队列移动到所述资源的等待队列。

根据本发明的另一方面,提供了一种分布式系统中多线程同步的 系统。

一种分布式系统中多线程同步的系统,包括:用于接收线程的资 源控制请求的装置,所述请求具有参数,所述参数包括所述线程的标 识和所请求资源的资源名;用于根据所述资源名读取所述资源的资源 节点的数据的装置;用于尝试锁定所述资源的装置,其中当锁定失败, 把该线程的标识置于该资源的等待队列以使得该线程进入阻塞状态, 当锁定成功,则该线程控制该资源,并且待所述线程利用所述资源完 成执行后,释放所述资源,并唤醒该资源的等待队列中的其他线程, 其中被唤醒的线程能够尝试锁定所述资源。

可选地,所述资源节点下包含如下部分,其中,同步队列,所述 同步队列包括等待控制所述资源的线程;占用线程,所述占用线程是 当前控制所述资源的线程;自定义条件集合,所述自定义条件集合中 的每个条件具有等待队列。

可选地,线程在控制所述资源后,如果发现所述自定义条件集合 中的条件不满足,则释放所述资源并进入阻塞状态,且该线程的标识 被置于该条件的等待队列。

可选地,当所述自定义条件集合中的条件满足后,把该条件的等 待队列中的线程从该条件的等待队列移动到所述资源的等待队列。

根据本发明的又一方面,提供了一种分布式系统中多线程同步的 系统。

一种分布式系统中多线程同步的系统,包括:存储器和处理器, 其中,所述存储器存储指令;所述处理器执行所述指令用于:接收线 程的资源控制请求,所述请求具有参数,所述参数包括所述线程的标 识和所请求资源的资源名;根据所述资源名读取所述资源的资源节点 的数据;尝试锁定所述资源,其中当锁定失败,把该线程的标识置于 该资源的等待队列以使得该线程进入阻塞状态,当锁定成功,则该线 程控制该资源,并且待所述线程利用所述资源完成执行后,释放所述 资源,并唤醒该资源的等待队列中的其他线程,其中被唤醒的线程能 够尝试锁定所述资源。

根据本发明的技术方案,通过基于分布式线程同步组件Zookeeper 实现分布式系统中多机器线程对资源的控制和主动释放,利用 Zookeeper的回调监听机制来通知客户端进行相关线程的分布式同步调 用资源,极大提高了分布式线程同步的效率;同时本发明还支持自定 义条件对线程同步的灵活控制,从而做到了线程主动释放资源以及根 据自定义条件唤醒相关线程,进而可以控制线程的执行顺序,且资源 利用率高。

附图说明

附图用于更好地理解本发明,不构成对本发明的不当限定。其中:

图1是根据本发明实施方式的分布式系统中多线程同步的方法的 主要步骤示意图;

图2是本发明实施例的多线程同步树形结构图;

图3是本发明实施例的多线程获取资源的流程图;

图4是根据本发明实施方式的分布式系统中多线程同步的系统的 主要模块示意图。

具体实施方式

以下结合附图对本发明的示范性实施例做出说明,其中包括本发 明实施例的各种细节以助于理解,应当将它们认为仅仅是示范性的。 因此,本领域普通技术人员应当认识到,可以对这里描述的实施例做 出各种改变和修改,而不会背离本发明的范围和精神。同样,为了清 楚和简明,以下的描述中省略了对公知功能和结构的描述。

图1是根据本发明实施方式的分布式系统中多线程同步的方法的 主要步骤示意图。如图1所示,本发明的分布式系统中多线程同步的 方法主要包括如下的步骤S11至步骤S13。

步骤S11:接收线程的资源控制请求,该请求具有参数,参数包 括线程的标识和所请求资源的资源名;

步骤S12:根据资源名读取资源的资源节点的数据;

步骤S13:尝试锁定资源,其中当锁定失败,把该线程的标识置 于该资源的等待队列以使得该线程进入阻塞状态,当锁定成功,则该 线程控制该资源,并且待该线程利用该资源完成执行后,释放该资源, 并唤醒该资源的等待队列中的其他线程,其中被唤醒的线程能够尝试 锁定该资源。

其中,步骤S12中读取资源的资源节点的数据的步骤包括:当所 述资源存在,则直接获取所述资源的资源节点,否则根据所述资源名 创建相应的资源节点,并读取所述资源节点的数据。

并且,在读取资源的资源节点的数据之后,还可以包括:对所述 资源进行校验,以确定所述资源有效且未被锁定。

根据本发明的技术方案,通过在所述资源节点下创建资源锁定节 点来锁定所述资源,并通过删除所述资源锁定节点来释放所述资源。

并且,在每个资源节点下可以包含如下部分,其中,同步队列, 所述同步队列包括等待控制所述资源的线程;占用线程,所述占用线 程是当前控制所述资源的线程;自定义条件集合,所述自定义条件集 合中的每个条件具有等待队列。

线程在控制所述资源后,如果发现所述自定义条件集合中的条件 不满足,则释放所述资源并进入阻塞状态,且该线程的标识被置于该 条件的等待队列。并且,当所述自定义条件集合中的条件满足后,把 该条件的等待队列中的线程从该条件的等待队列移动到所述资源的等 待队列。

图2是本发明实施例的多线程同步树形结构图。本发明作为分布 式系统中多线程同步的组件,线程对资源的锁定全部由本发明的线程 同步组件来实现,对上层系统的线程是透明的。本发明基于Zookeeper 进行分布式系统中多线程的同步,根据Zookeeper的回调监听机制来通 知系统中相关线程使用资源进行操作。

如图2所示,表示了整个Zookeeper系统中多机器线程及资源存 储的树形结构。以“/”来分割每一级节点。其中,/synchor/clients下 的所有的子节点是表示使用本发明进行线程同步的服务器节点。每个 服务器节点存了该服务器的IP地址、该服务器的唯一标识、以及该服 务器所使用的操作系统类型等基本信息,且这些基本信息是由服务器 在启动的时候推送到本发明的组件并在Zookeeper的相应节点进行注 册。/synchro/rsLocks下的所有节点表示的是所有的使用到的资源信息 对应的节点。每个资源节点是动态生成的,且每个资源节点下包含了 同步队列节点(synQueues),占用线程节点(locked),和自定义条件集 合(conditions)节点。其中,同步队列包括等待控制该资源的线程;占用 线程是当前控制该资源的线程;自定义条件集合,是可以动态指定生 成的,但是已定的条件节点下如有线程在等待,则该条件不会变化, 如需增加新的条件可添加新的节点来实现,并且该自定义条件集合中 每个条件具有等待队列。

另外,本发明中对资源定义例如可以是字符串,在整个分布式环 境中不同的字符串内容就表示不同的资源。

图3是本发明实施例的多线程获取资源的流程图。如图3所示, 本发明中,分布式系统中的多服务器线程会主动申请获取资源。

当分布式系统中,某台服务器上的某线程申请控制某资源时,会 发送资源控制请求到本发明的分布式同步组件Zookeeper,其中,资源 控制请求的参数中包括该服务器的唯一标识、该线程的唯一标识以及 请求访问的资源的资源名(说明1)。Zookeeper接收到资源控制请求 后,会对该请求的参数,进行初步解析和初始化(说明2),以获取该 请求中包含的资源名。然后,Zookeeper会根据资源名查找并尝试获取 该资源节点的值。此时,Zookeeper会先判断当前资源节点是否存在(说 明3),如果该资源节点存在,则会通知该线程直接读取该资源节点的 值;如果该资源节点不存在,则会先根据资源名创建相应的节点,然 后再读取该资源节点的值(说明4)。在获取该资源节点的值后,会进 行信息校验,一是校验该资源节点的资源是否为所需要的资源,以及 该资源节点的内容是否已过期等,亦即校验该资源节点的值是否有效; 二是根据该资源节点的值判定该资源节点是否已被锁定(有其他线程 正在使用该资源),其中,该资源节点若已被锁定,会包含已锁定的 标识信息。

当该线程获取到该资源节点的值,且验证所述资源有效且未被锁 定后,Zookeeper会尝试锁定该资源以避免其他线程同时使用该资源。 本发明通过在资源节点下创建资源锁定节点来锁定资源。例如,本发 明对资源锁定的方式是直接创建/synchro/rsLocks/资源名称节点 /locked,其中,“/locked”即为资源锁定节点。如果创建成功,则说明 当前锁定成功,且该资源锁定节点的值为“服务器唯一标识+线程唯一 标识”。如果在创建资源锁定节点时,返回此节点已经存在,则比较 资源锁定节点“/locked”的值与资源控制请求的参数中包含的“服务 器唯一标识+线程唯一标识”是否一致,如果一致,则说明该资源已经 被该线程获取,返回锁定成功,否则锁定失败(说明5)。

如果返回锁定资源成功,则该线程根据自定义的条件逻辑执行后 续的操作,且在操作完成或者在需要主动释放资源的情况下会释放资 源并阻塞该线程,以便其他线程可以控制该资源(说明9)。其中,需 要主动释放资源的情况会在后文中进行详细介绍,此处略过。如果返 回锁定资源失败,则直接将该线程放入/synchro/rsLocks/资源节点 /synQueues/节点下,表示该线程在等待资源被释放(说明6)。同时, 在锁定资源失败后,服务器本地会得到返回结果,并在本地将线程信 息缓存起来。在进行线程信息缓存时,可以键名-键值对(Key-value) 的形式进行存储,其中键名Key为“服务器唯一标识+线程唯一标识”。 同时线程会立刻阻塞不可用(说明7)。并且,在其他线程执行完成并 且释放资源后,根据预设的线程执行顺序会被唤醒变成可用,并重新 尝试锁定资源。

其中,在一个线程执行完预定的逻辑后,会尝试释放资源。资源 释放的过程如下:首先,Zookeeper会删除资源锁定节点“/locked”, 然后,会将/synchro/rsLocks/资源节点/synQueues/下的一个节点取出。 由于Zookeeper的客户端监听了相应资源节点,当对资源节点下的等待 队列(synQueues)删除节点的时候,会通知所有相关的服务器。服务 器节点收到回调通知后,判定当前移出该资源节点下的等待队列的节 点是否是与自己相关的节点,如果是,就会以“服务器唯一标识+线程 唯一标识”为键名Key,从服务器本地内存中取出对应的线程信息,让 线程变得可用,并且该线程会重新去申请资源(说明8)。

当一个线程执行完对应的逻辑操作并释放资源后,Zookeeper会从 资源的等待同步队列synQueues中取出其他节点并尝试锁定资源(说明 9)。Zookeeper在从等待同步队列synQueues中取出节点时,可灵活设 置规则,例如:可公平取出(采用公平锁),即:将等待同步队列中 的第一个节点取出;也可不公平取出(采用不公平锁),最简单的即 为随机取出,任何线程都可尝试锁定资源;还可设置规则例如根据所 有线程请求控制资源的时间的先后顺序来取等,例如:当一个线程执 行完对应的逻辑操作并释放资源后,资源节点下的条件队列 “/synchro/rsLocks/rs/condtions/conditon1”中所有符合条件conditon1 的线程都会转移到等待同步队列中,此时可根据等待同步队列中所有 线程的资源控制请求时间来排序并依次取出各线程。

另外,本发明还可以实现根据自定义条件主动控制资源锁。本发 明中线程对资源的占用分为主动占用和被动占用两种。基于自定义条 件执行线程同步是控制线程按照预设的执行顺序执行的重要手段。当 某个线程已经获取了资源后,发现其中某些自定义的条件还未满足, 则该线程会主动阻塞当前线程,并且释放当前资源以便其他线程可以 使用该资源。待其他线程执行完成且该线程已满足所有自定义条件时, 该线程会被重新唤醒并继续执行自身的代码逻辑。

本发明中线程根据自定义条件执行线程同步的步骤为:

步骤A:服务器s1上的线程a获取到资源(rs),则Zookeeper会执 行写/synchro/rsLocks/rs/locked节点;

步骤B:线程a在执行过程中,发现执行的条件(condition1)不满 足,就会将condition1和该线程的信息(服务器唯一标识+线程a的唯 一标识)传到本发明的线程同步组件Zookeeper,以申请阻塞当前线程, 并且,该线程被重新唤醒的条件为即为“满足条件condition1”;

步骤C:Zookeeper在收到该线程的阻塞请求后,会将 “/synchro/rsLocks/rs/locked”节点的信息复制到一个新创建的节点: “/synchro/rsLocks/rs/condtions/conditon1/s1_a”;

步骤D:然后,删除上述的locked节点,说明当前资源已经被释 放,且线程a被阻塞,状态变成不可用;

步骤E:当其他线程获取资源并且执行完某些操作,尝试唤醒“条 件condition1”下的线程时,本发明的线程同步组件Zookeeper会将 “/synchro/rsLocks/rs/condtions/conditon1/s1_a”节点的信息转移到 “/synchro/rsLocks/rs/synQueues/s1_a”节点,表示该线程已经从“条件 condition1”的等待队列移动到该资源的等待队列中,并根据预定的线 程取出规则(如前所述的公平取出、不公平取出或者其他自定义规则 等)唤醒s1服务器上的a线程,让其重新申请锁定资源,然后继续执 行代码逻辑。

另外,本发明还提出了一种分布式系统中多线程同步的系统,主 要包括:用于接收线程的资源控制请求的装置,所述请求具有参数, 所述参数包括所述线程的标识和所请求资源的资源名;用于根据所述 资源名读取所述资源的资源节点的数据的装置;用于尝试锁定所述资 源的装置,其中当锁定失败,把该线程的标识置于该资源的等待队列 以使得该线程进入阻塞状态,当锁定成功,则该线程控制该资源,并 且待所述线程利用所述资源完成执行后,释放所述资源,并唤醒该资 源的等待队列中的其他线程,其中被唤醒的线程能够尝试锁定所述资 源。

本发明中,所述资源节点下包含如下部分,其中,同步队列,所 述同步队列包括等待控制所述资源的线程;占用线程,所述占用线程 是当前控制所述资源的线程;自定义条件集合,所述自定义条件集合 中的每个条件具有等待队列。

根据本发明的技术方案,线程在控制所述资源后,如果发现所述 自定义条件集合中的条件不满足,则释放所述资源并进入阻塞状态, 且该线程的标识被置于该条件的等待队列。并且,当所述自定义条件 集合中的条件满足后,把该条件的等待队列中的线程从该条件的等待 队列移动到所述资源的等待队列。

图4是根据本发明实施方式的分布式系统中多线程同步的系统的 主要模块示意图。如图4所示,本发明的分布式系统中多线程同步的 系统40主要包括存储器41和处理器42。

其中,存储器41存储指令;处理器42执行所述指令用于:接收 线程的资源控制请求,所述请求的参数包括所述线程的标识和所请求 资源的资源名;根据所述资源名读取所述资源的资源节点的数据;尝 试锁定所述资源;当锁定失败,把该线程的标识置于该资源的等待队 列以使得该线程进入阻塞状态,当锁定成功,则该线程控制该资源, 并且待所述线程利用所述资源完成执行后,释放所述资源,并唤醒该 资源的等待队列中的其他线程,其中被唤醒的线程能够尝试锁定所述 资源。

根据本发明实施例的技术方案,通过基于分布式线程同步组件 Zookeeper实现分布式系统中多机器线程对资源的控制和主动释放,利 用Zookeeper的回调监听机制来通知客户端进行相关线程的分布式同 步调用资源,极大提高了分布式线程同步的效率;同时本发明还支持 自定义条件对线程同步的灵活控制,从而做到了线程主动释放资源以 及根据自定义条件唤醒相关线程,进而可以控制线程的执行顺序,且 资源利用率高。

上述具体实施方式,并不构成对本发明保护范围的限制。本领域 技术人员应该明白的是,取决于设计要求和其他因素,可以发生各种 各样的修改、组合、子组合和替代。任何在本发明的精神和原则之内 所作的修改、等同替换和改进等,均应包含在本发明保护范围之内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号