CN108228332B - 对象池访问方法及装置 - Google Patents
对象池访问方法及装置 Download PDFInfo
- Publication number
- CN108228332B CN108228332B CN201611146642.8A CN201611146642A CN108228332B CN 108228332 B CN108228332 B CN 108228332B CN 201611146642 A CN201611146642 A CN 201611146642A CN 108228332 B CN108228332 B CN 108228332B
- Authority
- CN
- China
- Prior art keywords
- target
- pool
- thread
- state
- available
- 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
- 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/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5027—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
Abstract
本申请提供一种对象池访问方法及装置,该方法包括:当目标线程需要从目标对象池中借出对象时,判断目标线程之前是否从目标对象池中借出过对象;若目标线程之前从目标对象池中借出过对象,则判断目标线程之前借出过的对象当前是否可用;若目标线程之前借出过的对象当前可用,则将该对象的状态修改为已被目标线程占用的状态。由此可见,本申请技术方案中,当线程需要访问对象池中的对象时,可以先判断该线程之前是否访问过该对象池中的对象,如果之前访问过该对象池中的对象,则优先检查该对象当前是否可用,与现有技术相比,由于本申请实施例可以有针对性的访问对象池中的对象,因此可以避免盲目地遍历整个对象池,从而达到节省CPU资源的目的。
Description
技术领域
本申请涉及对象池技术领域,特别涉及一种对象池访问方法及装置。
背景技术
目前,为了降低对象的创建、使用及销毁的开销,引入对象池技术,现有技术中,线程在访问对象池中的对象时,需要遍历整个对象池,直至查找到可用的对象,然而,遍历对象池这一操作会占用较多的CPU资源,造成CPU资源的浪费。
发明内容
为了解决上述问题,本申请提供一种对象池访问方法及装置。
具体地,本申请是通过如下技术方案实现的:
根据本申请实施例的第一方面,提供一种对象池访问方法,所述方法包括:
当目标线程需要从目标对象池中借出对象时,判断该目标线程之前是否从所述目标对象池中借出过对象;
若所述目标线程之前从所述目标对象池中借出过对象,则判断所述目标线程之前借出过的对象当前是否可用;
若所述目标线程之前借出过的对象当前可用,则将该对象的状态修改为已被所述目标线程占用的状态。
本申请一实施例中,所述方法还包括:
若所述目标线程之前未从所述目标对象池中借出过对象、或所述目标线程之前借出过的对象当前不可用,则遍历所述目标对象池;
若遍历所述目标对象池的过程中查找到可用对象,则将所述可用对象的状态修改为已被所述目标线程占用的状态。
本申请一实施例中,所述方法还包括:
检测所述目标对象池中是否有对象被还回;
若所述目标对象池中有对象被还回,则将所述目标对象池的状态修改为有对象被还回的状态。
本申请一实施例中,在所述将所述目标对象池的状态修改为有对象被还回的状态之后,还包括:
当检测到所述目标对象池中无可用的对象时,将所述目标对象池的状态修改为无可用对象状态。
本申请一实施例中,所述方法还包括:
若遍历所述目标对象池的过程中未查找到可用对象,且检测到遍历结束后所述目标对象池的状态为有对象被还回的状态,则再次遍历所述目标对象池;
若遍历所述目标对象池的过程中未查找到可用对象,且检测到遍历结束后所述目标对象池的状态为无可用对象状态,则控制所述目标线程进入限时等待队列。
本申请一实施例中,在所述控制所述目标线程进入限时等待队列之后,还包括:
当检测到所述目标对象池中有对象被还回、或达到限时等待时长时,唤醒所述等待队列中的线程。
本申请一实施例中,所述判断该目标线程之前是否从所述目标对象池中借出过对象,包括:
从所述目标线程对应的threadlocal中获得对象访问列表,其中,所述对象访问列表中记录有所述目标线程历史访问的对象及各对象所属的对象池;
判断所述对象访问列表中是否记录有所述目标对象池中的对象。
本申请一实施例中,判断所述目标线程之前借出过的对象当前是否可用,包括:
通过JAVA中的CAS操作,判断所述目标线程之前借出过的对象当前是否可用。
根据本申请实施例的第二方面,提供一种对象池访问装置,所述装置包括:
第一判断模块,用于在目标线程需要从目标对象池中借出对象的情况下,判断该目标线程之前是否从所述目标对象池中借出过对象;
第二判断模块,用于在所述第一判断模块的判断结果为是的情况下,判断所述目标线程之前借出过的对象当前是否可用;
第一修改模块,用于在所述第二判断模块的判断结果为是的情况下,将该对象的状态修改为已被所述目标线程占用的状态。
本申请一实施例中,所述装置还包括:
第一遍历模块,用于在所述第一判断模块的判断结果为否、或所述第二判断模块的判断结果为否的情况下,遍历所述目标对象池;
第二修改模块,用于在所述第一遍历模块遍历所述目标对象池的过程中查找到可用对象的情况下,将所述可用对象的状态修改为已被所述目标线程占用的状态。
本申请一实施例中,所述装置还包括:
检测模块,用于检测所述目标对象池中是否有对象被还回;
第三修改模块,用于在所述检测模块的检测结果为是的情况下,将所述目标对象池的状态修改为有对象被还回的状态。
本申请一实施例中,所述装置还包括:
第四修改模块,用于在检测到所述目标对象池中无可用的对象的情况下,将所述目标对象池的状态修改为无可用对象状态。
本申请一实施例中,所述装置还包括:
第二遍历模块,用于在遍历所述目标对象池的过程中未查找到可用对象,且检测到遍历结束后所述目标对象池的状态为有对象被还回的状态的情况下,遍历所述目标对象池;
控制模块,用于在遍历所述目标对象池的过程中未查找到可用对象,且检测到遍历结束后所述目标对象池的状态为无可用对象状态的情况下,控制所述目标线程进入限时等待队列。
本申请一实施例中,所述装置还包括:
唤醒模块,用于在检测到所述目标对象池中有对象被还回、或达到限时等待时长的情况下,唤醒所述等待队列中的线程。
本申请一实施例中,所述第一判断模块,包括:
列表获得子模块,用于在目标线程需要从目标对象池中借出对象的情况下,从所述目标线程对应的threadlocal中获得对象访问列表,其中,所述对象访问列表中记录有所述目标线程历史访问的对象及各对象所属的对象池;
第一判断子模块,用于判断所述列表获得子模块获取到的对象访问列表中是否记录有所述目标对象池中的对象。
本申请一实施例中,所述第二判断模块,包括:
第二判断子模块,用于在所述第一判断模块的判断结果为是的情况下,通过JAVA中的CAS操作,判断所述目标线程之前借出过的对象当前是否可用。
根据本申请实施例的第三方面,提供一种计算机存储介质,所述存储介质中存储有程序指令,所述程序指令包括:
当目标线程需要从目标对象池中借出对象时,判断该目标线程之前是否从所述目标对象池中借出过对象;
若所述目标线程之前从所述目标对象池中借出过对象,则判断所述目标线程之前借出过的对象当前是否可用;
若所述目标线程之前借出过的对象当前可用,则将该对象的状态修改为已被所述目标线程占用的状态。
本申请实施例中,当线程需要访问对象池中的对象时,可以先判断该线程之前是否访问过该对象池中的对象,如果之前访问过该对象池中的对象,则优先检查该对象当前是否可用,与现有技术相比,由于本申请实施例可以有针对性的访问对象池中的对象,因此可以避免盲目地遍历整个对象池,从而可以达到节省CPU资源的目的。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性的,并不能限制本申请。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本发明的实施例,并与说明书一起用于解释本发明的原理。
图1是本申请根据一示例性实施例示出的一种对象池访问方法的流程图;
图2是本申请根据一示例性实施例示出的另一种对象池访问方法的流程图;
图3是本申请根据一示例性实施例示出的一种对象池访问装置的框图;
图4是本申请根据一示例性实施例示出的另一种对象池访问装置的框图;
图5是本申请根据一示例性实施例示出的另一种对象池访问装置的框图;
图6是本申请根据一示例性实施例示出的另一种对象池访问装置的框图;
图7是本申请根据一示例性实施例示出的另一种对象池访问装置的框图;
图8是本申请根据一示例性实施例示出的另一种对象池访问装置的框图;
图9是本申请根据一示例性实施例示出的另一种对象池访问装置的框图;
图10是本申请根据一示例性实施例示出的另一种对象池访问装置的框图。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本申请相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本申请的一些方面相一致的装置和方法的例子。
在本申请使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本申请。在本申请和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
应当理解,尽管在本申请可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本申请范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
当一个对象频繁被使用时,频繁地创建对象会消耗系统很大的性能,尤其是创建这个对象的开销比较大时,消耗的系统性能更大,为了解决这个问题,引入对象池技术。现有技术中,线程在访问对象池中的对象时,需要遍历整个对象池,直至查找到可用的对象,然而,遍历对象池这一操作会占用较多的CPU资源,造成CPU资源的浪费。为了解决现有技术中的问题,本申请提供了一种对象池访问方法及装置。
为了便于理解,下面首先对本申请实施例中涉及的一些概念进行介绍。
本申请实施例中,线程(thread)是程序中一个单一的顺序控制流程,是执行一个程序命令的单元。对象指的是面向对象程序设计中用来描述客观事物的程序单位,以连接池(连接池属于对象池的一种)为例,连接池中的对象指的是连接。对象池(Object Pool)的工作原理是:将用过的对象保存起来,等下一次需要这种对象时,再拿出来重复使用,从而在一定程度上减少频繁创建对象所造成的开销,对象池充当保存对象的“容器”。当一个线程需要一个对象的时候,它需要从对象池中借出一个对象,当使用完毕后需要将该对象还回对象池。
如图1所述,图1是本申请根据一示例性实施例示出的一种对象池访问方法的流程图,该方法可以包括以下步骤:
在步骤101中,当目标线程需要从目标对象池中借出对象时,判断该目标线程之前是否从目标对象池中借出过对象;若判断结果为是,则执行步骤102。
对象池中存储有限数量的对象,每个对象有一个标记,以标记该对象是否被占用。在对象池初始化时,对象池中的对象被创建,线程可以向该对象池索取对象,当使用完该对象后,还要把该对象还回到对象池,即释放占用。
每个线程都有一个对应的独享内存空间,即threadlocal,threadlocal中存储有用于记录对应线程历史访问的对象及各对象所属的对象池,基于该情况,本申请实施例中,步骤101可以包括步骤:S10和S11,其中,
S10,从目标线程对应的threadlocal中获得对象访问列表,其中,该对象访问列表中记录有目标线程历史访问的对象及各对象所属的对象池;
S11,判断对象访问列表中是否记录有目标对象池中的对象;若该对象访问列表中记录有目标对象池中的对象,则目标线程之前从目标对象池中借出过对象。
例如,目标线程为线程1,目标对象池为对象池1,线程1对应的threadlocal中存储的对象访问列表如表1所示,通过查表1发现,线程1之前访问过对象池1中的对象12和对象13。
表1
此外,除了可以采用基于threadlocal的方式,判断目标线程之前是否访问过目标对象池中的对象,本申请实施例中,还可以采用相关技术中的任一种技术手段,来实现判断目标线程之前是否访问过目标对象池中的对象的目的,本申请对此不作限定。
在步骤102中,判断目标线程之前借出过的对象当前是否可用;若判断结果为是,则执行步骤103。
本申请实施例中,如果目标对象池中的对象被标记为可用,则认为该对象是可用的。
例如,目标线程为线程1,目标对象池为对象池1,线程1之前访问过对象池1中的对象12和对象13,那么判断对象12和对象13当前是否可用。
JAVA中的CAS操作中携带有三个参数:对象的内存地址、预期状态和期望修改为的状态,当判断对象池中的一个对象当前是否可用时,可以执行CAS操作,基于该情况,本申请实施例中,步骤102可以包括:
通过JAVA中的CAS操作,判断目标线程之前借出过的对象当前是否可用。
本申请实施例中,当判断目标对象池中的目标对象当前是否可用时,可以设置CAS操作的三个参数分别为:目标对象的内存地址、可用(预期状态)和被目标线程占用(期望修改为的状态),当参数设置完成之后,根据目标对象的内存地址查找到目标对象,将预期状态与目标对象的实际状态(可用或被占用)进行比较,如果预期状态与目标对象的实际状态相同,则确定目标对象池中的目标对象可用。
在步骤103中,将该对象的状态修改为已被目标线程占用的状态。
本申请实施例中,在将目标对象标记为被目标线程占用后,目标线程之外的线程不能够再借出该对象,直至目标线程将该对象还回到目标对象池、且该对象被标记为可用后,才可以被其他线程借出。
本申请实施例中,可以通过JAVA中的CAS操作,将该对象的状态修改为已被目标线程占用的状态,即将对象的状态修改为期望修改为的状态(被目标线程占用)。
由上述实施例可见,在该实施例中,当线程需要访问对象池中的对象时,可以先判断该线程之前是否访问过该对象池中的对象,如果之前访问过该对象池中的对象,则优先检查该对象当前是否可用,与现有技术相比,由于本申请实施例可以有针对性的访问对象池中的对象,因此可以避免盲目地遍历整个对象池,从而可以达到节省CPU资源的目的。
如图2所示,图2是本申请根据一示例性实施例示出的另一种对象池访问方法的流程图,在目标线程之前未从目标对象池中借出过对象、或目标线程之前借出过的对象当前不可用的情况下,为了尽可能地保证可以从对象池中借出对象,此时该方法可以包括以下步骤:
在步骤201中,当目标线程需要从目标对象池中借出对象时,判断该目标线程之前是否从目标对象池中借出过对象;若判断结果为是,则执行步骤202,若判断结果为否,则执行步骤204。
在步骤202中,判断目标线程之前借出过的对象当前是否可用;若判断结果为是,则执行步骤203,若判断结果为否,则执行步骤204。
在步骤203中,将该对象的状态修改为已被目标线程占用的状态。
本申请实施例中的步骤201、步骤202和步骤203,分别与图1所示实施例中的步骤101、步骤102和步骤103类似,本申请实施例对此不再赘述,详情请见图1所示实施例中的内容。
在步骤204中,遍历目标对象池。
本申请实施例中,可以采用JAVA中的CAS操作,对整个目标对象池进行遍历。
例如,目标对象池中包含对象20、对象21、对象22和对象23,需要逐个判断目标对象池中对象是否可用。
在步骤205中,当遍历目标对象池的过程中查找到可用对象时,将该可用对象的状态修改为已被目标线程占用的状态。
本申请实施例中,当遍历目标对象池的过程中查找到可用对象时,结束遍历操作,以免造成不必要的CPU资源的开销。
由上述实施例可见,在该实施例中,当线程需要访问对象池中的对象时,先判断该线程之前是否访问过该对象池中的对象,如果之前访问过该对象池中的对象,则优先检查该对象当前是否可用,如果之前访问过的对象不可用,则遍历整个对象池,以尽可能地保证可以从对象池中借出对象。
本申请提供的另一种实施例中,考虑到被占用的对象还回的情况,该实施例可以在图1或图2所示实施例的基础上,本申请提供的对象池访问方法还可以包括步骤:S20和S21,其中,
S20,检测目标对象池中是否有对象被还回;
S21,当检测到该目标对象池中有对象被还回时,将该目标对象池的状态修改为有对象被还回的状态。
本申请实施例中,当检测到目标对象池中有对象被还回时,将被还回的对象标记为可用,之后将该目标对象池的状态修改为有对象被还回的状态,以便当对象池存在可用对象时,需要借出对象的线程可以在第一时间获悉该情况。
对象池通常有一个版本号,基于该情况,本申请实施例中,可以通过对该版本号进行修改,来达到修改目标对象的状态的目的,例如,将对象池的版本号加1,表示该对象池中有对象被还回;或者将对象池的版本号加2,表示该对象池中有对象被还回,本申请对此不作限定。
本申请提供的另一种实施例中,该实施例可以在上一实施例的基础上,在S21之后,还可以包括以下步骤:
S22,当检测到目标对象池中无可用的对象时,将目标对象池的状态修改为无可用对象状态。
本申请实施例中,无可用对象状态指的是目标对象池中不存在可用的对象。
本申请提供的另一种实施例中,该实施例可以在上一实施例的基础上,在S22之后,还可以包括以下步骤:S23和S24,其中,
S23,当遍历目标对象池的过程中未查找到可用对象,且检测到遍历结束后该目标对象池的状态为有对象被还回的状态时,再次遍历所述目标对象池;
本申请实施例中,如果遍历目标对象池的过程中未查找对可用对象,则说明该目标对象池中不存在可用的对象,如果遍历结束后该目标对象池的状态变为有对象被还回的状态,则说明遍历的过程中该目标对象池中又有了可用的对象,因此,当遍历目标对象池的过程中未查找到可用对象,且检测到遍历结束后该目标对象池的状态为有对象被还回的状态时,再次对该目标对象池进行遍历,很有可能查找到可用的对象。
S24,当遍历目标对象池的过程中未查找到可用对象,且检测到遍历结束后该目标对象池的状态为无可用对象状态时,控制目标线程进入限时等待队列。
本申请实施例中,如果遍历目标对象池的过程中未查找对可用对象,则说明该目标对象池中不存在可用的对象,如果遍历结束后该目标对象池的状态没有变为有对象被还回的状态,则说明遍历的过程中该目标对象池中仍没有可用的对象,因此,当遍历目标对象池的过程中未查找到可用对象,且检测到遍历结束后该目标对象池的状态为无可用对象状态时,控制目标线程进入限时等待队列,以防止持续执行遍历操作而耗尽CPU资源。
本申请提供的另一种实施例中,该实施例可以在上一实施例的基础上,在S24之后,还可以包括以下步骤:
S25,当检测到目标对象池中有对象被还回、或达到限时等待时长时,唤醒等待队列中的线程。
本申请实施例中,如果检测到目标对象池中有对象被还回,则说明该目标对象池中又有了可用的对象,此时可以提前唤醒等待队列中的线程,以保证等待队列中的线程可以及时借出对象;此外,当等待队列的等待超时时,唤醒该等待队列中的线程。
应当注意,尽管在附图中以特定顺序描述了本申请方法的操作,但是,这并非要求或者暗示必须按照该特定顺序来执行这些操作,或是必须执行全部所示的操作才能实现期望的结果。相反,流程图中描绘的步骤可以改变执行顺序。附加地或备选地,可以省略某些步骤,将多个步骤合并为一个步骤执行,和/或将一个步骤分解为多个步骤执行。
与前述对象池访问方法的实施例对应,本申请还提供了对象池访问装置的实施例。
如图3所示,图3是本申请根据一示例性实施例示出的一种对象池访问装置的框图,该装置可以包括:
第一判断模块310,用于在目标线程需要从目标对象池中借出对象的情况下,判断该目标线程之前是否从所述目标对象池中借出过对象;
第二判断模块320,用于在所述第一判断模块310的判断结果为是的情况下,判断所述目标线程之前借出过的对象当前是否可用;
第一修改模块330,用于在所述第二判断模块320的判断结果为是的情况下,将该对象的状态修改为已被所述目标线程占用的状态。
由上述实施例可见,在该实施例中,当线程需要访问对象池中的对象时,可以先判断该线程之前是否访问过该对象池中的对象,如果之前访问过该对象池中的对象,则优先检查该对象当前是否可用,与现有技术相比,由于本申请实施例可以有针对性的访问对象池中的对象,因此可以避免盲目地遍历整个对象池,从而可以达到节省CPU资源的目的。
如图4所示,图4是本申请根据一示例性实施例示出的另一种对象池访问装置的框图,该实施例可以在图3所示实施例的基础上,所述装置还可以包括:
第一遍历模块410,用于在所述第一判断模块310的判断结果为否、或所述第二判断模块320的判断结果为否的情况下,遍历所述目标对象池;
第二修改模块420,用于在所述第一遍历模块410遍历所述目标对象池的过程中查找到可用对象的情况下,将所述可用对象的状态修改为已被所述目标线程占用的状态。
如图5所示,图5是本申请根据一示例性实施例示出的另一种对象池访问装置的框图,该实施例可以在图3所示实施例的基础上,所述装置还可以包括:
检测模块510,用于检测所述目标对象池中是否有对象被还回;
第三修改模块520,用于在所述检测模块510的检测结果为是的情况下,将所述目标对象池的状态修改为有对象被还回的状态。
如图6所示,图6是本申请根据一示例性实施例示出的另一种对象池访问装置的框图,该实施例可以在图5所示实施例的基础上,所述装置还可以包括:
第四修改模块610,用于在检测到所述目标对象池中无可用的对象的情况下,将所述目标对象池的状态修改为无可用对象状态。
如图7所示,图7是本申请根据一示例性实施例示出的另一种对象池访问装置的框图,该实施例可以在图6所示实施例的基础上,所述装置还可以包括:
第二遍历模块710,用于在遍历所述目标对象池的过程中未查找到可用对象,且检测到遍历结束后所述目标对象池的状态为有对象被还回的状态的情况下,遍历所述目标对象池;
控制模块720,用于在遍历所述目标对象池的过程中未查找到可用对象,且检测到遍历结束后所述目标对象池的状态为无可用对象状态的情况下,控制所述目标线程进入限时等待队列。
如图8所示,图8是本申请根据一示例性实施例示出的另一种对象池访问装置的框图,该实施例可以在图7所示实施例的基础上,所述装置还可以包括:
唤醒模块810,用于在检测到所述目标对象池中有对象被还回、或达到限时等待时长的情况下,唤醒所述等待队列中的线程。
如图9所示,图9是本申请根据一示例性实施例示出的另一种对象池访问装置的框图,该实施例可以在图3~图8所示任一实施例的基础上,所述第一判断模块310,可以包括:
列表获得子模块311,用于在目标线程需要从目标对象池中借出对象的情况下,从所述目标线程对应的threadlocal中获得对象访问列表,其中,所述对象访问列表中记录有所述目标线程历史访问的对象及各对象所属的对象池;
第一判断子模块312,用于判断所述列表获得子模块311获取到的对象访问列表中是否记录有所述目标对象池中的对象。
如图10所示,图10是本申请根据一示例性实施例示出的另一种对象池访问装置的框图,该实施例可以在图3~图9所示任一实施例的基础上,所述第二判断模块320,可以包括:
第二判断子模块321,用于在所述第一判断模块310的判断结果为是的情况下,通过JAVA中的CAS操作,判断所述目标线程之前借出过的对象当前是否可用。
上述装置中各个模块的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。
对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本申请方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
本申请还提供了一种计算机存储介质,所述存储介质中存储有程序指令,所述程序指令包括:当目标线程需要从目标对象池中借出对象时,判断该目标线程之前是否从所述目标对象池中借出过对象;若所述目标线程之前从所述目标对象池中借出过对象,则判断所述目标线程之前借出过的对象当前是否可用;若所述目标线程之前借出过的对象当前可用,则将该对象的状态修改为已被所述目标线程占用的状态。
本申请可采用在一个或多个其中包含有程序代码的存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。计算机可用存储介质包括永久性和非永久性、可移动和非可移动媒体,可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括但不限于:相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。
本领域技术人员在考虑说明书及实践这里公开的公开后,将容易想到本申请的其它实施方案。本申请旨在涵盖本申请的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本申请的一般性原理并包括本申请未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本申请的真正范围和精神由下面的权利要求指出。
应当理解的是,本申请并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本申请的范围仅由所附的权利要求来限制。
Claims (15)
1.一种对象池访问方法,其特征在于,所述方法包括:
当目标线程需要从目标对象池中借出对象时,判断该目标线程之前是否从所述目标对象池中借出过对象;
若所述目标线程之前从所述目标对象池中借出过对象,则判断所述目标线程之前借出过的对象当前是否可用;
若所述目标线程之前借出过的对象当前可用,则将该对象的状态修改为已被所述目标线程占用的状态;
所述判断该目标线程之前是否从所述目标对象池中借出过对象,包括:
从所述目标线程对应的threadlocal中获得对象访问列表,其中,所述对象访问列表中记录有所述目标线程历史访问的对象及各对象所属的对象池;
判断所述对象访问列表中是否记录有所述目标对象池中的对象。
2.根据权利要求1所述的方法,其特征在于,所述方法还包括:
若所述目标线程之前未从所述目标对象池中借出过对象、或所述目标线程之前借出过的对象当前不可用,则遍历所述目标对象池;
若遍历所述目标对象池的过程中查找到可用对象,则将所述可用对象的状态修改为已被所述目标线程占用的状态。
3.根据权利要求1或2所述的方法,其特征在于,所述方法还包括:
检测所述目标对象池中是否有对象被还回;
若所述目标对象池中有对象被还回,则将所述目标对象池的状态修改为有对象被还回的状态。
4.根据权利要求3所述的方法,其特征在于,在所述将所述目标对象池的状态修改为有对象被还回的状态之后,还包括:
当检测到所述目标对象池中无可用的对象时,将所述目标对象池的状态修改为无可用对象状态。
5.根据权利要求4所述的方法,其特征在于,所述方法还包括:
若遍历所述目标对象池的过程中未查找到可用对象,且检测到遍历结束后所述目标对象池的状态为有对象被还回的状态,则再次遍历所述目标对象池;
若遍历所述目标对象池的过程中未查找到可用对象,且检测到遍历结束后所述目标对象池的状态为无可用对象状态,则控制所述目标线程进入限时等待队列。
6.根据权利要求5所述的方法,其特征在于,在所述控制所述目标线程进入限时等待队列之后,还包括:
当检测到所述目标对象池中有对象被还回、或达到限时等待时长时,唤醒所述等待队列中的线程。
7.根据权利要求1所述的方法,其特征在于,判断所述目标线程之前借出过的对象当前是否可用,包括:
通过JAVA中的CAS操作,判断所述目标线程之前借出过的对象当前是否可用。
8.一种对象池访问装置,其特征在于,所述装置包括:
第一判断模块,用于在目标线程需要从目标对象池中借出对象的情况下,判断该目标线程之前是否从所述目标对象池中借出过对象;
第二判断模块,用于在所述第一判断模块的判断结果为是的情况下,判断所述目标线程之前借出过的对象当前是否可用;
第一修改模块,用于在所述第二判断模块的判断结果为是的情况下,将该对象的状态修改为已被所述目标线程占用的状态;
所述第一判断模块,包括:
列表获得子模块,用于在目标线程需要从目标对象池中借出对象的情况下,从所述目标线程对应的threadlocal中获得对象访问列表,其中,所述对象访问列表中记录有所述目标线程历史访问的对象及各对象所属的对象池;
第一判断子模块,用于判断所述列表获得子模块获取到的对象访问列表中是否记录有所述目标对象池中的对象。
9.根据权利要求8所述的装置,其特征在于,所述装置还包括:
第一遍历模块,用于在所述第一判断模块的判断结果为否、或所述第二判断模块的判断结果为否的情况下,遍历所述目标对象池;
第二修改模块,用于在所述第一遍历模块遍历所述目标对象池的过程中查找到可用对象的情况下,将所述可用对象的状态修改为已被所述目标线程占用的状态。
10.根据权利要求8或9所述的装置,其特征在于,所述装置还包括:
检测模块,用于检测所述目标对象池中是否有对象被还回;
第三修改模块,用于在所述检测模块的检测结果为是的情况下,将所述目标对象池的状态修改为有对象被还回的状态。
11.根据权利要求10所述的装置,其特征在于,所述装置还包括:
第四修改模块,用于在检测到所述目标对象池中无可用的对象的情况下,将所述目标对象池的状态修改为无可用对象状态。
12.根据权利要求11所述的装置,其特征在于,所述装置还包括:
第二遍历模块,用于在遍历所述目标对象池的过程中未查找到可用对象,且检测到遍历结束后所述目标对象池的状态为有对象被还回的状态的情况下,遍历所述目标对象池;
控制模块,用于在遍历所述目标对象池的过程中未查找到可用对象,且检测到遍历结束后所述目标对象池的状态为无可用对象状态的情况下,控制所述目标线程进入限时等待队列。
13.根据权利要求12所述的装置,其特征在于,所述装置还包括:
唤醒模块,用于在检测到所述目标对象池中有对象被还回、或达到限时等待时长的情况下,唤醒所述等待队列中的线程。
14.根据权利要求8所述的装置,其特征在于,所述第二判断模块,包括:
第二判断子模块,用于在所述第一判断模块的判断结果为是的情况下,通过JAVA中的CAS操作,判断所述目标线程之前借出过的对象当前是否可用。
15.一种计算机存储介质,其特征在于,所述存储介质中存储有程序指令,所述程序指令包括:
当目标线程需要从目标对象池中借出对象时,判断该目标线程之前是否从所述目标对象池中借出过对象;
若所述目标线程之前从所述目标对象池中借出过对象,则判断所述目标线程之前借出过的对象当前是否可用;
若所述目标线程之前借出过的对象当前可用,则将该对象的状态修改为已被所述目标线程占用的状态;
所述判断该目标线程之前是否从所述目标对象池中借出过对象,包括:
从所述目标线程对应的threadlocal中获得对象访问列表,其中,所述对象访问列表中记录有所述目标线程历史访问的对象及各对象所属的对象池;
判断所述对象访问列表中是否记录有所述目标对象池中的对象。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611146642.8A CN108228332B (zh) | 2016-12-13 | 2016-12-13 | 对象池访问方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611146642.8A CN108228332B (zh) | 2016-12-13 | 2016-12-13 | 对象池访问方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108228332A CN108228332A (zh) | 2018-06-29 |
CN108228332B true CN108228332B (zh) | 2020-12-08 |
Family
ID=62638884
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201611146642.8A Active CN108228332B (zh) | 2016-12-13 | 2016-12-13 | 对象池访问方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108228332B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109298901B (zh) * | 2018-08-29 | 2022-05-31 | 百度在线网络技术(北京)有限公司 | 无人车中对象处理方法、装置、设备、存储介质和车辆 |
CN110471763B (zh) * | 2019-07-29 | 2023-07-25 | 平安科技(深圳)有限公司 | 基于共享对象池的调度方法、系统、介质及电子设备 |
CN113778571B (zh) * | 2021-09-13 | 2024-03-29 | 深圳市快易典教育科技有限公司 | 一种对象池访问方法、装置、电子设备及存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6564377B1 (en) * | 1999-07-26 | 2003-05-13 | Microsoft Corporation | Self-describing components within a software catalog |
CN101593131A (zh) * | 2008-05-28 | 2009-12-02 | 国际商业机器公司 | 基于对象池来实现线程操作的方法和设备 |
CN106020822A (zh) * | 2016-05-18 | 2016-10-12 | 腾讯科技(成都)有限公司 | 面向Pool对象的弱引用实现方法和装置 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8145817B2 (en) * | 2009-04-28 | 2012-03-27 | Microsoft Corporation | Reader/writer lock with reduced cache contention |
US9973384B2 (en) * | 2014-01-21 | 2018-05-15 | Oracle International Corporation | System and method for enterprise java bean support in a multitenant application server environment |
-
2016
- 2016-12-13 CN CN201611146642.8A patent/CN108228332B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6564377B1 (en) * | 1999-07-26 | 2003-05-13 | Microsoft Corporation | Self-describing components within a software catalog |
CN101593131A (zh) * | 2008-05-28 | 2009-12-02 | 国际商业机器公司 | 基于对象池来实现线程操作的方法和设备 |
CN106020822A (zh) * | 2016-05-18 | 2016-10-12 | 腾讯科技(成都)有限公司 | 面向Pool对象的弱引用实现方法和装置 |
Non-Patent Citations (1)
Title |
---|
ThreadLocal;新浪博客;《http://blog.sina.com.cn/s/blog_4adc4b090102vkox.html》;20150130;全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN108228332A (zh) | 2018-06-29 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107968810B (zh) | 一种服务器集群的资源调度方法、装置和系统 | |
CN108228332B (zh) | 对象池访问方法及装置 | |
CN108959118B (zh) | 一种数据写入的方法及装置 | |
CN109558237A (zh) | 一种任务状态管理方法及装置 | |
CN107783734B (zh) | 一种基于超融合存储系统的资源分配方法、装置及终端 | |
RU2676018C2 (ru) | Система и способ для создания выборочных моментальных снимков базы данных | |
CN109978167A (zh) | 在数据中心中存储和检索用于模型的训练数据 | |
CN110389842B (zh) | 一种动态资源分配方法、装置、存储介质及设备 | |
US9269182B2 (en) | System and method for identifying entry points of a hierarchical structure | |
CN109033365B (zh) | 一种数据处理方法及相关设备 | |
CN112130769B (zh) | 一种机械硬盘数据处理方法、装置、设备及介质 | |
CN110737717A (zh) | 一种数据库迁移方法及装置 | |
CN109495531A (zh) | 请求处理方法及装置 | |
CN111338803A (zh) | 一种线程处理方法和装置 | |
CN109582396B (zh) | 一种任务状态处理方法、装置、系统及存储介质 | |
CN104572655B (zh) | 数据处理的方法、装置及系统 | |
CN108595249A (zh) | 一种虚拟机任务调度方法及电子设备 | |
CN106202262B (zh) | 一种信息处理方法及电子设备 | |
CN111125087A (zh) | 数据的存储方法及装置 | |
CN110297714B (zh) | 基于大规模图数据集获取PageRank的方法及装置 | |
CN108563507A (zh) | 一种内存管理方法、装置、设备及可读存储介质 | |
CN105612505A (zh) | Cpu调度的方法和装置 | |
TWI757741B (zh) | 安全任務處理方法和電子設備 | |
US20130110882A1 (en) | System and method for persisting object pointers | |
US9857864B1 (en) | Systems and methods for reducing power consumption in a memory architecture |
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 |