CN105843686A - 单例组件资源释放方法及装置 - Google Patents
单例组件资源释放方法及装置 Download PDFInfo
- Publication number
- CN105843686A CN105843686A CN201610189080.9A CN201610189080A CN105843686A CN 105843686 A CN105843686 A CN 105843686A CN 201610189080 A CN201610189080 A CN 201610189080A CN 105843686 A CN105843686 A CN 105843686A
- Authority
- CN
- China
- Prior art keywords
- caller
- single example
- list
- enumerator
- example assembly
- 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.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 151
- 230000000712 assembly Effects 0.000 claims description 7
- 238000000429 assembly Methods 0.000 claims description 7
- 238000007599 discharging Methods 0.000 claims description 6
- 238000012217 deletion Methods 0.000 claims description 4
- 230000037430 deletion Effects 0.000 claims description 4
- 230000003068 static effect Effects 0.000 description 10
- 230000008569 process Effects 0.000 description 8
- 230000008901 benefit Effects 0.000 description 5
- 230000009471 action Effects 0.000 description 4
- 238000010586 diagram Methods 0.000 description 4
- 238000005096 rolling process Methods 0.000 description 4
- 238000013459 approach Methods 0.000 description 2
- 230000008859 change Effects 0.000 description 2
- 230000006378 damage Effects 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004044 response Effects 0.000 description 2
- 230000000007 visual effect Effects 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 238000012545 processing Methods 0.000 description 1
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
- G06F9/5055—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 considering software capabilities, i.e. software resources associated or available to the machine
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Mobile Radio Communication Systems (AREA)
Abstract
本发明公开了一种单例组件资源释放方法及装置,包括:为单例组件创建计数器和调用者列表;根据所述单例组件的获取方法被不同调用者所调用的次数对所述计数器进行加1运算,并将调用者的调用者信息存入所述调用者列表;根据所述单例组件的资源释放方法被不同调用者所调用的次数对所述计数器进行减1运算,并将调用者的调用者信息从所述调用者列表中删除;当所述计数器的计数为0时,进行针对所述单例组件的资源释放。本发明提出的单例组件资源释放方法及装置,能够解决单例组件在多个调用者存在的情况下释放资源会引起相互冲突的问题。
Description
技术领域
本发明涉及数据处理技术领域,特别是指一种单例组件资源释放方法及装置。
背景技术
单例模式是指,当某个组件被创建出来后,再有其它人调用该组件时,不再重复创建,而是将已经创建好的组件的实例返回给调用者,相当于多个调用者共享同一个组件,从而节省重复创建的时间和内存。
Android系统中的某些组件,创建耗时较长,占用内存较大,而且调用频繁;为了加快调用速度、节省内存,从而引入了单例模式,这里,使用单例模式来调用的组件,就是单例组件。
某些Android组件在使用完毕后,必须调用其释放资源的方法,这个组件的生命周期才算真正结束,从而可以被系统回收;而某些组件一旦被调用过释放资源的方法,它就无法再被其他人使用了,强行调用会违反其生命周期,程序会报错甚至崩溃;若需要再次使用该组件,则需要重新创建。
现有技术中需要释放资源的组件包括:数据库和数据库打开工具、线程池、数据库连接池、网络连接池,等等;这些组件以单例模式访问,成为单例组件,可以避免重复创建,节省时间和内存,但是考虑到它们释放资源的特殊性,则会存在以下问题:
假设调用者A访问了一个单例模式的数据库,数据库被创建;然后调用者B也访问这个数据库,不重复创建,直接复用已有的,也就是说此时调用者A和调用者B手中的数据库是同一个;然后调用者A使用完毕,调用了数据库的资源释放方法,数据库生命周期结束,进入不可用状态(注意,此时数据库并未销毁,只是不可再用了);但是调用者B并不知道,仍然读取了数据库,此时:
因为该数据库还没销毁,所以再有人调用它,在单例模式中不会重新创建,因此无法得到新的、生命周期可用的数据库;
因为该数据库的生命周期已结束,进入不可用状态,再调用它,程序会抛出异常,如果代码里没有对这个异常进行压制,则会导致程序崩溃,即使对这个异常进行了压制,调用者B实际上也无法正常使用这个数据库了。
发明内容
有鉴于此,本发明的目的在于提出一种单例组件资源释放方法及装置,能够解决单例组件在多个调用者存在的情况下释放资源会引起相互冲突的问题。
基于上述目的本发明提供的单例组件资源释放方法,包括:
为单例组件创建计数器和调用者列表;
根据所述单例组件的获取方法被不同调用者所调用的次数对所述计数器进行加1运算,并将调用者的调用者信息存入所述调用者列表;
根据所述单例组件的资源释放方法被不同调用者所调用的次数对所述计数器进行减1运算,并将调用者的调用者信息从所述调用者列表中删除;
当所述计数器的计数为0时,进行针对所述单例组件的资源释放。
在一些实施方式中,所述根据所述单例组件的获取方法被不同调用者所调用的次数对所述计数器进行加1运算,并将调用者的调用者信息存入所述调用者列表的步骤包括:
若所述单例组件的获取方法被调用,则判断所述单例组件的获取方法的调用者的调用者信息是否存在于所述调用者列表中;
若所述调用者的调用者信息存在于所述调用者列表中,则计数器不加1;
若所述调用者的调用者信息不存在于所述调用者列表中,则计数器加1,并将所述调用者的调用者信息存入所述调用者列表中。
在一些实施方式中,所述根据所述单例组件的资源释放方法被不同调用者所调用的次数对所述计数器进行减1运算,并将调用者的调用者信息从所述调用者列表中删除的步骤包括:
若所述单例组件的资源释放方法被调用,则判断调用所述单例组件的资源释放方法的调用者的调用者信息是否存在于所述调用者列表中;
若所述调用者的调用者信息存在于所述调用者列表中,则将所述计数器的计数减1,并将所述调用者的调用者信息从所述调用者列表中删除;
若所述调用者的调用者信息不存在于所述调用者列表中,则所述计数器的计数不变。
在一些实施方式中,所述的方法还包括:
若所述单例组件所依赖的程序被关闭,或者,所述单例组件及其调用者所依赖的其他组件被销毁,则清零所述计数器并清空所述调用者列表;
通过预留的强制销毁的入口,强制释放所述单例组件的资源并销毁所述单例组件。
在一些实施方式中,所述调用者信息的获取方法包括:
获取包含所述单例组件的调用记录的调用栈;
从所述调用栈中找到调用者的调用者信息。
本发明的另一方面还提供了一种单例组件资源释放装置,包括:
计数器和列表创建模块,用于为单例组件创建计数器和调用者列表;
计数器和列表修改模块,用于根据所述单例组件的获取方法被不同调用者所调用的次数对所述计数器进行加1运算,并将调用者的调用者信息存入所述调用者列表;以及,根据所述单例组件的资源释放方法被不同调用者所调用的次数对所述计数器进行减1运算,并将调用者的调用者信息从所述调用者列表中删除;
资源释放模块,当所述计数器的计数为0时,用于进行针对所述单例组件的资源释放。
在一些实施方式中,所述计数器和列表修改模块,具体用于:
若所述单例组件的获取方法被调用,则判断所述单例组件的获取方法的调用者的调用者信息是否存在于所述调用者列表中;
若所述调用者的调用者信息存在于所述调用者列表中,则计数器不加1;
若所述调用者的调用者信息不存在于所述调用者列表中,则计数器加1,并将所述调用者的调用者信息存入所述调用者列表中。
在一些实施方式中,所述计数器和列表修改模块,具体用于:
若所述单例组件的资源释放方法被调用,则判断调用所述单例组件的资源释放方法的调用者的调用者信息是否存在于所述调用者列表中;
若所述调用者的调用者信息存在于所述调用者列表中,则将所述计数器的计数减1,并将所述调用者的调用者信息从所述调用者列表中删除;
若所述调用者的调用者信息不存在于所述调用者列表中,则所述计数器的计数不变。
在一些实施方式中,所述的装置还包括资源强制强制释放模块,具体用于:
若所述单例组件所依赖的程序被关闭,或者,所述单例组件及其调用者所依赖的其他组件被销毁,则清零所述计数器并清空所述调用者列表;
通过预留的强制销毁的入口,强制释放所述单例组件的资源并销毁所述单例组件。
在一些实施方式中,所述计数器和列表修改模块,还用于获取调用者信息,具体包括:
获取包含所述单例组件的调用记录的调用栈;
从所述调用栈中找到调用者的调用者信息。
从上面所述可以看出,本发明提供的所述单例组件资源释放方法及装置,通过引入计数器和调用者列表,在不同调用者调用单例组件获取方法时,所述计数器都加1,在不同调用者调用单例组件资源释放方法时,所述计数器都减1,并且在计数器的计数再次为0时,再进行针对所述单例组件的资源释放,从而解决了单例组件在多个调用者存在的情况下释放资源会引起相互冲突的问题。所述单例组件资源释放方法及装置,相对于传统的单例模式,能处理需要释放资源的单例组件,保有传统单例模式的避免重复创建、省时间省内存的优点;此外,还允许调用者在不顾及其它调用者是否释放了资源的情况下,进行资源释放,因为真正的释放资源的动作被封装在引用计数器判断的单例组件内部,无需外部去查询或者计数。所述单例组件资源释放方法及装置,代码量少而且简单,同时将单例模式和引用计数相结合,避免了单例组件释放资源导致的冲突。
附图说明
图1为本发明提供的单例组件资源释放方法的一个实施例的流程示意图;
图2为本发明提供的单例组件资源释放方法的另一个实施例的流程示意图;
图3为本发明提供的单例组件资源释放装置实施例的模块结构示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚明白,以下结合具体实施例,并参照附图,对本发明进一步详细说明。
需要说明的是,本发明实施例中所有使用“第一”和“第二”的表述均是为了区分两个相同名称非相同的实体或者非相同的参量,可见“第一”“第二”仅为了表述的方便,不应理解为对本发明实施例的限定,后续实施例对此不再一一说明。
本发明的第一个方面,提出了一种能够解决单例组件在多个调用者存在的情况下释放资源会引起相互冲突的问题的单例组件资源释放方法。如图1所示,为本发明提供的单例组件资源释放方法的一个实施例的流程示意图。
所述单例组件资源释放方法,包括以下步骤:
步骤101:为单例组件创建计数器和调用者列表;
所述计数器可以是装入单例组件内的一个计数器,可选的,所述计数器可以使用java标准的原子计数器(AtomicInteger),原子计数器可以保证多个线程同时操作它,一直能保证是最新的,另外它开销较少;所述计数器可以设置成静态的,以保证任何情况下,所述单例组件的内部读写都是同一个计数器,计数是可靠的;
步骤102:根据所述单例组件的获取方法被不同调用者所调用的次数对所述计数器进行加1运算,并将调用者的调用者信息存入所述调用者列表;
当所述单例组件的获取方法被不同调用者调用时,计数器加1,若为相同调用者,则在该调用者第一次调用所述单例组件的获取方法时,计数器加1,并在第一次调用时将调用者的调用者信息存入所述调用者列表,在后续调用时,判定所述调用者的调用者信息存在于所述调用者列表中,因此计数器则不再加1;
步骤103:根据所述单例组件的资源释放方法被不同调用者所调用的次数对所述计数器进行减1运算,并将调用者的调用者信息从所述调用者列表中删除;
当所述单例组件的资源释放方法被不同调用者调用时,计数器减1,若为相同调用者,则在该调用者第一次调用所述单例组件的资源释放方法时,计数器减1,并在第一次调用时将调用者的调用者信息从所述调用者列表中删除,在后续调用时,判定所述调用者的调用者信息不存在于所述调用者列表中,因此计数器则不再减1;
步骤104:当所述计数器的计数为0时,进行针对所述单例组件的资源释放;所述计数器的计数为0时,指代当计数器的计数为1时,被存在于所述调用者列表中的最后一个调用者调用所述单例组件的资源释放方法,此时计数器减1得到0,从而执行真正的资源释放,同时通过代码的控制,销毁所述单例组件;其后,当再调用所述单例组件时,则重新创建单例组件,因为单例组件是重新创建的,所以生命周期是完整可用的,从而不会影响后续调用者的调用;
这里所述计数器的计数为0的情况,是指所述计数器的计数已经大于或等于1以后,计数器的计数又减为0的情况,不包括计数器一开始的计数为0的情况;当计数器的计数为0时,说明所述单例组件上的所有调用者都释放了资源,此时,则可以对所述单例组件进行资源释放。
从上述实施例可以看出,本发明提供的所述单例组件资源释放方法,通过引入计数器和调用者列表,在不同调用者调用单例组件获取方法时,所述计数器都加1,在不同调用者调用单例组件资源释放方法时,所述计数器都减1,并且在计数器的计数再次为0时,再进行针对所述单例组件的资源释放,从而解决了单例组件在多个调用者存在的情况下释放资源会引起相互冲突的问题。所述单例组件资源释放方法,相对于传统的单例模式,能处理需要释放资源的单例组件,保有传统单例模式的避免重复创建、省时间省内存的优点;此外,还允许调用者在不顾及其它调用者是否释放了资源的情况下,进行资源释放,因为真正的释放资源的动作被封装在引用计数器判断的单例组件内部,无需外部去查询或者计数。所述单例组件资源释放方法,代码量少而且简单,同时将单例模式和引用计数相结合,避免了单例组件释放资源导致的冲突。
单例组件都有获取其实例的静态方法,当调用者第一次调用该静态的获取方法时,会创建该单例组件的实例;当再有调用者调用该静态的获取方法时,会直接返回该实例,不再重复创建;所述计数器的加1运算就发生在该静态的获取方法被调用时,但要注意一个问题:有可能是同一个调用者多次获取所述单例组件,这种情况下从调用者自身的视角来看,它只需要释放一次资源就可以了,因为获取到的是同一个单例组件。所以,单纯根据单例组件的获取方法被调用的次数来进行加1运算,会导致计数器数字过大,调用者释放资源的次数可能比不上获取单例组件的次数,最终使得单例组件无法真正释放资源并销毁。
综上,加1运算的时机应该是:一个新的调用者首次获取所述单例组件时;为了准确识别这个时机,进一步的,在一些可选实施方式中,所述根据所述单例组件的获取方法被不同调用者所调用的次数对所述计数器进行加1运算,并将调用者的调用者信息存入所述调用者列表的步骤102还可具体包括以下步骤:
判断所述单例组件的获取方法是否被调用;
若所述单例组件的获取方法被调用,则判断所述单例组件的获取方法的调用者的调用者信息是否存在于所述调用者列表中;可选的,所述单例组件内除了所述计数器,还存在一个调用者列表,当单例组件的获取方法被调用时,程序代码会从所述调用者列表中自动寻找调用者;
若所述调用者的调用者信息存在于所述调用者列表中,说明这个调用者曾经获取过所述单例组件,则计数器不加1;
若所述调用者的调用者信息不存在于所述调用者列表中,说明这是个新的调用者首次获取所述单例组件,则计数器加1,并将所述调用者的调用者信息存入所述调用者列表中。
通过上述实施例,能够具体地针对单例组件获取方法的不同的调用者进行计数器加1运算,而不对同一调用者对所述单例组件获取方法的重复调用进行重复的加1运算,从而保证计数器计数与调用者数目相一致,避免出现重复计数。
与所述计数器加1运算的过程类似,在进行计数器减1运算的过程中,仍然需要识别调用者;任意调用者调用了单例组件的资源释放方法,将该调用者的调用者信息从调用者列表中去除,因此,较佳的,在一些可选实施方式中,所述根据所述单例组件的资源释放方法被不同调用者所调用的次数对所述计数器进行减1运算,并将调用者的调用者信息从所述调用者列表中删除的步骤103还可具体包括以下步骤:
判断所述单例组件的资源释放方法是否被调用;
若所述单例组件的资源释放方法被调用,则判断调用所述单例组件的资源释放方法的调用者的调用者信息是否存在于所述调用者列表中;
若所述调用者的调用者信息存在于所述调用者列表中,表示逻辑是正常的,则将所述计数器的计数减1,并将所述调用者的调用者信息从所述调用者列表中删除;
若所述调用者的调用者信息不存在于所述调用者列表中,表示该调用者所持有的所述单例组件,但不是通过正常的单例组件获取方法而获取的,很可能是别的调用者通过正常方法获取后,传给该调用者的,所以该调用者的调用者信息不会出现在调用者列表中;对于这种情况,可以遵循“谁获取,谁释放”的原则:只有通过正常的单例组件获取方法获得所述单例组件的调用者试图释放资源时,计数器才进行减1运算,并将其调用者信息从所述调用者列表中删除,对于非正常途径得到所述单例组件的调用者,其试图释放资源的操作,则被认定为无效,计数器不发生任何响应;因此,在所述调用者的调用者信息不存在于所述调用者列表中的情况下,所述计数器的计数不变。
此外,如果计数器的计数为0,说明所有调用者都表示要释放该单例组件的资源了,此时则调用所述单例组件的资源释放方法,然后销毁该单例组件;如果计数器的计数大于0,说明还有调用者在使用该单例组件,不能释放其资源,不进行任何操作。
通过上述实施例,所述能够具体地基于单例组件资源释放方法的调用者的身份判断来选择是否进行计数器减1运算,而针对非正常获取单例组件的调用者,其释放资源时,不对计数器进行减1运算,从而保证计数器计数与正常的调用者数目相一致,避免出现错误计数。
可选的,在一些实施方式中,所述单例组件资源释放方法,还可进一步包括以下步骤:
若所述单例组件所依赖的程序被关闭,或者,所述单例组件及其调用者所处的大环境整体被销毁,则清零所述计数器并清空所述调用者列表;所述大环境整体被销毁,可以是指,所述单例组件及其调用者本身是某一大组件或程序的附属单例组件及其调用者,当这些大组件或程序需要被销毁时,所述单例组件自然没有存在的必要,因此需要抛开计数器因素而直接强制释放资源;
通过预留的强制销毁的入口,强制释放所述单例组件的资源并销毁所述单例组件。
通过上述实施例,保证在所述单例组件所依赖的程序或组件需要被关闭或销毁时,不因所述单例组件的计数器的计数还未为0而阻止其所依赖的程序或组件的整体的资源释放,从而能够通过对单例组件进行强行资源释放而保证程序能够正常关闭或组件能够被正常销毁。
可选的,在一些实施方式中,对于调用者的调用者信息,其获取方法可具体包括以下步骤:
获取包含所述单例组件的调用记录的调用栈;java中任何一个方法被调用时,都可以从系统获取调用栈(也就是方法调用的完整记录),调用栈中会显示调用者信息;
从所述调用栈中找到调用者的调用者信息;所述调用栈中的调用者信息,包括调用者的内存地址,同一个内存地址的调用者,则认为是同一个调用者。
通过上述实施例,能够快速并准确地获取调用者的调用者信息,并判断两次或多次调用的调用者是否为同一调用者。
本发明还提供了所述单例组件资源释放方法的另一个实施例。如图2所示,为本发明提供的单例组件资源释放方法的另一个实施例的流程示意图。
所述单例组件资源释放方法,包括以下步骤:
步骤201:单例组件的获取方法被首次调用,创建单例组件,并为所述单例组件创建计数器和调用者列表;
步骤202:判断所述单例组件的获取方法是否被调用;
步骤203:若所述单例组件的获取方法被调用,则判断所述单例组件的获取方法的调用者的调用者信息是否存在于所述调用者列表中;
步骤204:若所述调用者的调用者信息存在于所述调用者列表中,则计数器不加1;
步骤205:若所述调用者的调用者信息不存在于所述调用者列表中,则计数器加1,并将所述调用者的调用者信息存入所述调用者列表中;
步骤206:判断所述单例组件的资源释放方法是否被调用;
步骤207:若所述单例组件的资源释放方法被调用,则判断调用所述单例组件的资源释放方法的调用者的调用者信息是否存在于所述调用者列表中;
步骤208:若所述调用者的调用者信息存在于所述调用者列表中,则将所述计数器的计数减1,并将所述调用者的调用者信息从所述调用者列表中删除;
步骤209:若所述调用者的调用者信息不存在于所述调用者列表中,则所述计数器的计数不变;
步骤210:判断所述计数器的计数是否为0;
步骤211:若所述计数器的计数不为0,则不做其他进一步处理,并等待其他指令;
步骤212:若所述计数器的计数为0,进行针对所述单例组件的资源释放。
从上述实施例可以看出,本发明提供的所述单例组件资源释放方法,通过引入计数器和调用者列表,在不同调用者调用单例组件获取方法时,所述计数器都加1,在不同调用者调用单例组件资源释放方法时,所述计数器都减1,并且在计数器的计数再次为0时,再进行针对所述单例组件的资源释放,从而解决了单例组件在多个调用者存在的情况下释放资源会引起相互冲突的问题。所述单例组件资源释放方法,相对于传统的单例模式,能处理需要释放资源的单例组件,保有传统单例模式的避免重复创建、省时间省内存的优点;此外,还允许调用者在不顾及其它调用者是否释放了资源的情况下,进行资源释放,因为真正的释放资源的动作被封装在引用计数器判断的单例组件内部,无需外部去查询或者计数。所述单例组件资源释放方法,代码量少而且简单,同时将单例模式和引用计数相结合,避免了单例组件释放资源导致的冲突。
本发明的第二个方面,提出了一种能够解决单例组件在多个调用者存在的情况下释放资源会引起相互冲突的问题的单例组件资源释放装置。如图3所示,为本发明提供的单例组件资源释放装置实施例的模块结构示意图。
所述单例组件资源释放装置,包括:
计数器和列表创建模块301,用于为单例组件创建计数器和调用者列表;
所述计数器可以是装入单例组件内的一个计数器,可选的,所述计数器可以使用java标准的原子计数器(AtomicInteger),原子计数器可以保证多个线程同时操作它,一直能保证是最新的,另外它开销较少;所述计数器可以设置成静态的,以保证任何情况下,所述单例组件的内部读写都是同一个计数器,计数是可靠的;
计数器和列表修改模块302,用于根据所述单例组件的获取方法被不同调用者所调用的次数对所述计数器进行加1运算,并将调用者的调用者信息存入所述调用者列表;当所述单例组件的获取方法被不同调用者调用时,计数器加1,若为相同调用者,则在该调用者第一次调用所述单例组件的获取方法时,计数器加1,并在第一次调用时将调用者的调用者信息存入所述调用者列表,在后续调用时,判定所述调用者的调用者信息存在于所述调用者列表中,因此计数器则不再加1;
所述计数器和列表修改模块302,还用于根据所述单例组件的资源释放方法被不同调用者所调用的次数对所述计数器进行减1运算,并将调用者的调用者信息从所述调用者列表中删除;当所述单例组件的资源释放方法被不同调用者调用时,计数器减1,若为相同调用者,则在该调用者第一次调用所述单例组件的资源释放方法时,计数器减1,并在第一次调用时将调用者的调用者信息从所述调用者列表中删除,在后续调用时,判定所述调用者的调用者信息不存在于所述调用者列表中,因此计数器则不再减1;
资源释放模块303,当所述计数器的计数为0时,用于进行针对所述单例组件的资源释放;所述计数器的计数为0时,指代当计数器的计数为1时,被存在于所述调用者列表中的最后一个调用者调用所述单例组件的资源释放方法,此时计数器减1得到0,从而执行真正的资源释放,同时通过代码的控制,销毁所述单例组件;其后,当再调用所述单例组件时,则重新创建单例组件,因为单例组件是重新创建的,所以生命周期是完整可用的,从而不会影响后续调用者的调用;
这里所述计数器的计数为0的情况,是指所述计数器的计数已经大于或等于1以后,计数器的计数又减为0的情况,不包括计数器一开始的计数为0的情况;当计数器的计数为0时,说明所述单例组件上的所有调用者都释放了资源,此时,则可以对所述单例组件进行资源释放。
从上述实施例可以看出,本发明提供的所述单例组件资源释放装置,通过引入计数器和调用者列表,在不同调用者调用单例组件获取方法时,所述计数器都加1,在不同调用者调用单例组件资源释放方法时,所述计数器都减1,并且在计数器的计数再次为0时,再进行针对所述单例组件的资源释放,从而解决了单例组件在多个调用者存在的情况下释放资源会引起相互冲突的问题。所述单例组件资源释放装置,相对于传统的单例模式,能处理需要释放资源的单例组件,保有传统单例模式的避免重复创建、省时间省内存的优点;此外,还允许调用者在不顾及其它调用者是否释放了资源的情况下,进行资源释放,因为真正的释放资源的动作被封装在引用计数器判断的单例组件内部,无需外部去查询或者计数。所述单例组件资源释放装置,代码量少而且简单,同时将单例模式和引用计数相结合,避免了单例组件释放资源导致的冲突。
单例组件都有获取其实例的静态方法,当调用者第一次调用该静态的获取方法时,会创建该单例组件的实例;当再有调用者调用该静态的获取方法时,会直接返回该实例,不再重复创建;所述计数器的加1运算就发生在该静态的获取方法被调用时,但要注意一个问题:有可能是同一个调用者多次获取所述单例组件,这种情况下从调用者自身的视角来看,它只需要释放一次资源就可以了,因为获取到的是同一个单例组件。所以,单纯根据单例组件的获取方法被调用的次数来进行加1运算,会导致计数器数字过大,调用者释放资源的次数可能比不上获取单例组件的次数,最终使得单例组件无法真正释放资源并销毁。
综上,加1运算的时机应该是:一个新的调用者首次获取所述单例组件时;为了准确识别这个时机,进一步的,在一些可选实施方式中,所述计数器和列表修改模块302,具体用于:
判断所述单例组件的获取方法是否被调用;
若所述单例组件的获取方法被调用,则判断所述单例组件的获取方法的调用者的调用者信息是否存在于所述调用者列表中;可选的,所述单例组件内除了所述计数器,还存在一个调用者列表,当单例组件的获取方法被调用时,程序代码会从所述调用者列表中自动寻找调用者;
若所述调用者的调用者信息存在于所述调用者列表中,说明这个调用者曾经获取过所述单例组件,则计数器不加1;
若所述调用者的调用者信息不存在于所述调用者列表中,说明这是个新的调用者首次获取所述单例组件,则计数器加1,并将所述调用者的调用者信息存入所述调用者列表中。
通过上述实施例,能够具体地针对单例组件获取方法的不同的调用者进行计数器加1运算,而不对同一调用者对所述单例组件获取方法的重复调用进行重复的加1运算,从而保证计数器计数与调用者数目相一致,避免出现重复计数。
与所述计数器加1运算的过程类似,在进行计数器减1运算的过程中,仍然需要识别调用者;任意调用者调用了单例组件的资源释放方法,将该调用者的调用者信息从调用者列表中去除,因此,较佳的,在一些可选实施方式中,所述计数器和列表修改模块302,具体用于:
判断所述单例组件的资源释放方法是否被调用;
若所述单例组件的资源释放方法被调用,则判断调用所述单例组件的资源释放方法的调用者的调用者信息是否存在于所述调用者列表中;
若所述调用者的调用者信息存在于所述调用者列表中,表示逻辑是正常的,则将所述计数器的计数减1,并将所述调用者的调用者信息从所述调用者列表中删除;
若所述调用者的调用者信息不存在于所述调用者列表中,表示该调用者所持有的所述单例组件,但不是通过正常的单例组件获取方法而获取的,很可能是别的调用者通过正常方法获取后,传给该调用者的,所以该调用者的调用者信息不会出现在调用者列表中;对于这种情况,可以遵循“谁获取,谁释放”的原则:只有通过正常的单例组件获取方法获得所述单例组件的调用者试图释放资源时,计数器才进行减1运算,并将其调用者信息从所述调用者列表中删除,对于非正常途径得到所述单例组件的调用者,其试图释放资源的操作,则被认定为无效,计数器不发生任何响应;因此,在所述调用者的调用者信息不存在于所述调用者列表中的情况下,所述计数器的计数不变。
此外,如果计数器的计数为0,说明所有调用者都表示要释放该单例组件的资源了,此时则调用所述单例组件的资源释放方法,然后销毁该单例组件;如果计数器的计数大于0,说明还有调用者在使用该单例组件,不能释放其资源,不进行任何操作。
通过上述实施例,所述能够具体地基于单例组件资源释放方法的调用者的身份判断来选择是否进行计数器减1运算,而针对非正常获取单例组件的调用者,其释放资源时,不对计数器进行减1运算,从而保证计数器计数与正常的调用者数目相一致,避免出现错误计数。
可选的,在一些实施方式中,所述单例组件资源释放装置,还包括资源强制强制释放模块304,具体用于:
若所述单例组件所依赖的程序被关闭,或者,所述单例组件及其调用者所处的大环境整体被销毁,则清零所述计数器并清空所述调用者列表;所述大环境整体被销毁,可以是指,所述单例组件及其调用者本身是某一大组件或程序的附属单例组件及其调用者,当这些大组件或程序需要被销毁时,所述单例组件自然没有存在的必要,因此需要抛开计数器因素而直接强制释放资源;
通过预留的强制销毁的入口,强制释放所述单例组件的资源并销毁所述单例组件。
通过上述实施例,保证在所述单例组件所依赖的程序或组件需要被关闭或销毁时,不因所述单例组件的计数器的计数还未为0而阻止其所依赖的程序或组件的整体的资源释放,从而能够通过对单例组件进行强行资源释放而保证程序能够正常关闭或组件能够被正常销毁。
可选的,在一些实施方式中,所述计数器和列表修改模块302,还用于获取调用者信息,具体包括:
获取包含所述单例组件的调用记录的调用栈;java中任何一个方法被调用时,都可以从系统获取调用栈(也就是方法调用的完整记录),调用栈中会显示调用者信息;
从所述调用栈中找到调用者的调用者信息;所述调用栈中的调用者信息,包括调用者的内存地址,同一个内存地址的调用者,则认为是同一个调用者。
通过上述实施例,能够快速并准确地获取调用者的调用者信息,并判断两次或多次调用的调用者是否为同一调用者。
所属领域的普通技术人员应当理解:以上任何实施例的讨论仅为示例性的,并非旨在暗示本公开的范围(包括权利要求)被限于这些例子;在本发明的思路下,以上实施例或者不同实施例中的技术特征之间也可以进行组合,步骤可以以任意顺序实现,并存在如上所述的本发明的不同方面的许多其它变化,为了简明它们没有在细节中提供。
另外,为简化说明和讨论,并且为了不会使本发明难以理解,在所提供的附图中可以示出或可以不示出与集成电路(IC)芯片和其它部件的公知的电源/接地连接。此外,可以以框图的形式示出装置,以便避免使本发明难以理解,并且这也考虑了以下事实,即关于这些框图装置的实施方式的细节是高度取决于将要实施本发明的平台的(即,这些细节应当完全处于本领域技术人员的理解范围内)。在阐述了具体细节(例如,电路)以描述本发明的示例性实施例的情况下,对本领域技术人员来说显而易见的是,可以在没有这些具体细节的情况下或者这些具体细节有变化的情况下实施本发明。因此,这些描述应被认为是说明性的而不是限制性的。
尽管已经结合了本发明的具体实施例对本发明进行了描述,但是根据前面的描述,这些实施例的很多替换、修改和变型对本领域普通技术人员来说将是显而易见的。例如,其它存储器架构(例如,动态RAM(DRAM))可以使用所讨论的实施例。
本发明的实施例旨在涵盖落入所附权利要求的宽泛范围之内的所有这样的替换、修改和变型。因此,凡在本发明的精神和原则之内,所做的任何省略、修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (10)
1.一种单例组件资源释放方法,其特征在于,包括:
为单例组件创建计数器和调用者列表;根据所述单例组件的获取方法被不同调用者所调用的次数对所述计数器进行加1运算,并将调用者的调用者信息存入所述调用者列表;
根据所述单例组件的资源释放方法被不同调用者所调用的次数对所述计数器进行减1运算,并将调用者的调用者信息从所述调用者列表中删除;
当所述计数器的计数为0时,进行针对所述单例组件的资源释放。
2.根据权利要求1所述的方法,其特征在于,所述根据所述单例组件的获取方法被不同调用者所调用的次数对所述计数器进行加1运算,并将调用者的调用者信息存入所述调用者列表的步骤包括:
若所述单例组件的获取方法被调用,则判断所述单例组件的获取方法的调用者的调用者信息是否存在于所述调用者列表中;
若所述调用者的调用者信息存在于所述调用者列表中,则计数器不加1;
若所述调用者的调用者信息不存在于所述调用者列表中,则计数器加1,并将所述调用者的调用者信息存入所述调用者列表中。
3.根据权利要求1所述的方法,其特征在于,所述根据所述单例组件的资源释放方法被不同调用者所调用的次数对所述计数器进行减1运算,并将调用者的调用者信息从所述调用者列表中删除的步骤包括:
若所述单例组件的资源释放方法被调用,则判断调用所述单例组件的资源释放方法的调用者的调用者信息是否存在于所述调用者列表中;
若所述调用者的调用者信息存在于所述调用者列表中,则将所述计数器的计数减1,并将所述调用者的调用者信息从所述调用者列表中删除;
若所述调用者的调用者信息不存在于所述调用者列表中,则所述计数器的计数不变。
4.根据权利要求1所述的方法,其特征在于,还包括:
若所述单例组件所依赖的程序被关闭,或者,所述单例组件及其调用者所依赖的其他组件被销毁,则清零所述计数器并清空所述调用者列表;
通过预留的强制销毁的入口,强制释放所述单例组件的资源并销毁所述单例组件。
5.根据权利要求1-4任意一项所述的方法,其特征在于,所述调用者信息的获取方法包括:
获取包含所述单例组件的调用记录的调用栈;
从所述调用栈中找到调用者的调用者信息。
6.一种单例组件资源释放装置,其特征在于,包括:
计数器和列表创建模块,用于为单例组件创建计数器和调用者列表;
计数器和列表修改模块,用于根据所述单例组件的获取方法被不同调用者所调用的次数对所述计数器进行加1运算,并将调用者的调用者信息存入所述调用者列表;以及,根据所述单例组件的资源释放方法被不同调用者所调用的次数对所述计数器进行减1运算,并将调用者的调用者信息从所述调用者列表中删除;
资源释放模块,当所述计数器的计数为0时,用于进行针对所述单例组件的资源释放。
7.根据权利要求6所述的装置,其特征在于,所述计数器和列表修改模块,具体用于:
若所述单例组件的获取方法被调用,则判断所述单例组件的获取方法的调用者的调用者信息是否存在于所述调用者列表中;
若所述调用者的调用者信息存在于所述调用者列表中,则计数器不加1;
若所述调用者的调用者信息不存在于所述调用者列表中,则计数器加1,并将所述调用者的调用者信息存入所述调用者列表中。
8.根据权利要求6所述的装置,其特征在于,所述计数器和列表修改模块,具体用于:
若所述单例组件的资源释放方法被调用,则判断调用所述单例组件的资源释放方法的调用者的调用者信息是否存在于所述调用者列表中;
若所述调用者的调用者信息存在于所述调用者列表中,则将所述计数器的计数减1,并将所述调用者的调用者信息从所述调用者列表中删除;
若所述调用者的调用者信息不存在于所述调用者列表中,则所述计数器的计数不变。
9.根据权利要求6所述的装置,其特征在于,还包括资源强制强制释放模块,具体用于:
若所述单例组件所依赖的程序被关闭,或者,所述单例组件及其调用者所依赖的其他组件被销毁,则清零所述计数器并清空所述调用者列表;
通过预留的强制销毁的入口,强制释放所述单例组件的资源并销毁所述单例组件。
10.根据权利要求6-9任意一项所述的装置,其特征在于,所述计数器和列表修改模块,还用于获取调用者信息,具体包括:
获取包含所述单例组件的调用记录的调用栈;
从所述调用栈中找到调用者的调用者信息。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610189080.9A CN105843686A (zh) | 2016-03-29 | 2016-03-29 | 单例组件资源释放方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610189080.9A CN105843686A (zh) | 2016-03-29 | 2016-03-29 | 单例组件资源释放方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN105843686A true CN105843686A (zh) | 2016-08-10 |
Family
ID=56584782
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610189080.9A Pending CN105843686A (zh) | 2016-03-29 | 2016-03-29 | 单例组件资源释放方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105843686A (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2019000473A1 (zh) * | 2017-06-30 | 2019-01-03 | 广东欧珀移动通信有限公司 | 系数计算方法、组件调用方法、装置、介质、服务器及终端 |
CN109240773A (zh) * | 2018-08-20 | 2019-01-18 | 武汉斗鱼网络科技有限公司 | 解决房间串数据的方法、装置、终端及可读存储介质 |
CN109901908A (zh) * | 2017-12-11 | 2019-06-18 | 中国移动通信集团山西有限公司 | 销毁docker容器的方法、装置、设备和介质 |
CN109918101A (zh) * | 2019-01-28 | 2019-06-21 | 努比亚技术有限公司 | 终端及其应用组件管理方法、计算机可读存储介质 |
CN110496395A (zh) * | 2019-08-22 | 2019-11-26 | 阿里巴巴集团控股有限公司 | 一种针对虚幻引擎的组件运行方法、系统及设备 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101288128A (zh) * | 2005-07-01 | 2008-10-15 | 微软公司 | 声明性地响应交互式多媒体环境中的状态变化 |
CN101853186A (zh) * | 2008-12-31 | 2010-10-06 | Sap股份公司 | 分布式事务恢复系统和方法 |
CN103309796A (zh) * | 2012-03-09 | 2013-09-18 | 腾讯科技(深圳)有限公司 | 一种组件对象模型对象的监控方法和装置 |
CN104391745A (zh) * | 2014-10-13 | 2015-03-04 | 浪潮通用软件有限公司 | 一种可扩展的对象生命周期管理方法 |
-
2016
- 2016-03-29 CN CN201610189080.9A patent/CN105843686A/zh active Pending
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101288128A (zh) * | 2005-07-01 | 2008-10-15 | 微软公司 | 声明性地响应交互式多媒体环境中的状态变化 |
CN101853186A (zh) * | 2008-12-31 | 2010-10-06 | Sap股份公司 | 分布式事务恢复系统和方法 |
CN103309796A (zh) * | 2012-03-09 | 2013-09-18 | 腾讯科技(深圳)有限公司 | 一种组件对象模型对象的监控方法和装置 |
CN104391745A (zh) * | 2014-10-13 | 2015-03-04 | 浪潮通用软件有限公司 | 一种可扩展的对象生命周期管理方法 |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2019000473A1 (zh) * | 2017-06-30 | 2019-01-03 | 广东欧珀移动通信有限公司 | 系数计算方法、组件调用方法、装置、介质、服务器及终端 |
US10783020B2 (en) | 2017-06-30 | 2020-09-22 | Guangdong Oppo Mobile Telecommunications Corp., Ltd. | Method for invoking component, and terminal |
CN109901908A (zh) * | 2017-12-11 | 2019-06-18 | 中国移动通信集团山西有限公司 | 销毁docker容器的方法、装置、设备和介质 |
CN109240773A (zh) * | 2018-08-20 | 2019-01-18 | 武汉斗鱼网络科技有限公司 | 解决房间串数据的方法、装置、终端及可读存储介质 |
CN109240773B (zh) * | 2018-08-20 | 2022-08-16 | 武汉斗鱼网络科技有限公司 | 解决房间串数据的方法、装置、终端及可读存储介质 |
CN109918101A (zh) * | 2019-01-28 | 2019-06-21 | 努比亚技术有限公司 | 终端及其应用组件管理方法、计算机可读存储介质 |
CN110496395A (zh) * | 2019-08-22 | 2019-11-26 | 阿里巴巴集团控股有限公司 | 一种针对虚幻引擎的组件运行方法、系统及设备 |
CN110496395B (zh) * | 2019-08-22 | 2023-02-21 | 创新先进技术有限公司 | 一种针对虚幻引擎的组件运行方法、系统及设备 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105843686A (zh) | 单例组件资源释放方法及装置 | |
CN109272323B (zh) | 一种风险交易识别方法、装置、设备及介质 | |
CN106648641A (zh) | 一种iOS系统设备上多层弹框的自动管理方法和系统 | |
CN107730377A (zh) | 贷款资质筛选方法、装置及计算机可读存储介质 | |
CN112560114B (zh) | 调用智能合约的方法及装置 | |
CN104050543B (zh) | 流处理系统中的事件处理方法及流处理系统 | |
CN107608885A (zh) | 内存泄漏点的定位方法、装置、系统及可读存储介质 | |
CN107450964A (zh) | 一种用于发现虚拟机自省系统中是否存在漏洞的方法 | |
CN108228449A (zh) | 终端设备控制方法及装置、终端设备及计算机可读存储介质 | |
SE9800161L (sv) | Metod vid databas | |
CN102467525A (zh) | 单据关联方法及系统 | |
CN103150159B (zh) | 使用命名对象的标识符生成 | |
DE112020002160T5 (de) | System und verfahren zum betreiben einer sicheren kontaktlosen transaktion | |
CN107239325A (zh) | 单证数据处理方法和装置 | |
US9384228B2 (en) | Implementing a multi-column/multi-row constraint in a relational database table | |
CN108108558B (zh) | 一种基于覆盖次数统计评价随机验证质量的方法及系统 | |
WO2024152475A1 (zh) | 一种防作弊的返现方法及系统 | |
CN106020822B (zh) | 面向Pool对象的弱引用实现方法和装置 | |
CN105760136A (zh) | 基于伪随机数的多维度可控算法 | |
CN106547617A (zh) | 一种采用分析-反馈-调优模式的内存管理方法及系统 | |
US20160205650A1 (en) | Method for preventing a ue from entering into a permanent out of service state | |
Dupuy-Coin et al. | A method of quantitation of nuclear bodies in electron microscopy | |
CN108959403A (zh) | 一种分布式事务处理方法及装置 | |
CN109240773A (zh) | 解决房间串数据的方法、装置、终端及可读存储介质 | |
CN105426221B (zh) | 通过jvm安全上下文实现缓存的方法和系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20160810 |
|
WD01 | Invention patent application deemed withdrawn after publication |