[发明专利]基于对象池来实现线程操作的方法和设备无效
申请号: | 200810098476.8 | 申请日: | 2008-05-28 |
公开(公告)号: | CN101593131A | 公开(公告)日: | 2009-12-02 |
发明(设计)人: | 赵奕;郑凯;王海川;高志国 | 申请(专利权)人: | 国际商业机器公司 |
主分类号: | G06F9/50 | 分类号: | G06F9/50 |
代理公司: | 北京市金杜律师事务所 | 代理人: | 冯 谱 |
地址: | 美国纽*** | 国省代码: | 美国;US |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 基于 对象 实现 线程 操作 方法 设备 | ||
技术领域
本发明一般地涉及数据处理,更具体地,涉及基于对象池来实现线程操作的方法和设备。
背景技术
很多现代编程语言已经建立垃圾收集器(GC)作为对象释放机制。利用此类编程语言开发的应用不能在使用之后显式地释放对象以恢复内存消耗。在多线程服务器应用中,更快增长的死亡对象往往触发过于频繁的垃圾收集操作,这将消耗太多的CPU时间并且令性能降级。
传统对象池技术(例如WebSphere内置的对象池)用于将使用过的对象暂时缓存在对象池中以备下次使用,即,通过对象池来重复使用对象而不是将其直接放置到垃圾收集器中。将对象放入到对象池中就意味着该对象不再被程序的任何模块使用,直到该对象被程序(线程)再次从对象池中取出。对该对象池的两个操作原语是get(或者getFrom),put(或者putBack),下面是二者的操作语义。
Get操作语义:
IF对象池非空THEN
取出一个对象,将对象返回给线程
ELSE
创建一个新的对象,将对象返回给线程
END IF
Put操作语义:
IF对象池非满THEN
将对象放入到对象池中
ELSE
抛弃此对象
END IF
尽管这样的对象池技术有效地减小了垃圾收集操作,但当以多线程方式进行运行时,对象池的使用将导致另一种性能问题。如图1所示,当多个线程要访问单个的全局对象池时,由于该对象池需要加锁来保护其内部数据结构的一致性,所以对单个对象池上的锁争用将很容易变成性能的瓶颈,破坏程序的可伸缩性。
为了避免上述的对单个的全局对象池的锁争用,采取多个对象池来平衡工作负载以及分摊锁争用。如图2中所示,该方案利用一个负载均衡器(Round Robin选择器)来分发(轮转调度)对多个对象池的访问,每个对象池仍然由锁来保护,通过降低单个对象池上锁争用的概率并延缓争用频率来增加并发访问能力。然而,当线程数目增大时,例如数目大到超过对象池的个数时,其并不解决锁争用冲突问题,并且不能确保线程不会比其他线程更为频繁地尝试使用这些对象池的一个或多个,这也同样造成严重的锁争用。
另外,Java1.2的线程局部类(ThreadLocal class)技术和其他现有技术中的技术方案也不能支持“生产者-消费者”使用模型和解决其带来的问题。生产者-消费者使用模型是指:线程A总是从一个对象池中取出对象,然后把该对象传递给另外一个线程B使用,线程B使用完该对象之后,总是将该对象归还给另一对象池。在这种使用模式下,该使用到的两个子对象池就会出现不均衡现象,即线程A所使用的私有对象池会越来越空,而线程B所使用的私有对象池会越来越满。
因此,需要一种改进的基于对象池来实现线程操作的方法和设备,其能够有效地解决对象池的锁争用,支持多个线程对对象的共享(即解决“生产者-消费者”使用模型问题),从而提高编程开发的生产效率。
发明内容
本发明的目的是解决对对象池访问时的锁争用问题,从而能够进行对象池的并发访问,以及实现多个线程对对象的共享。
为了实现上述的目的,本发明提供一种基于对象池来实现线程操作的方法,该方法包括将多个线程通过映射表与全局对象池中的多个子对象池进行一对一的绑定,响应于线程对全局对象池的访问,通过映射表查找与该线程绑定的子对象池,以及全局对象池将线程的操作转发到查找到的与该线程绑定的子对象池。
另外,本发明还提供一种基于对象池来实现线程操作的设备,该设备包括映射装置,用于将多个线程通过映射表与全局对象池中的多个子对象池进行一对一的绑定,以及转发装置,用于响应于线程对全局对象池的访问,将所述线程的操作转发到通过映射装置查找到的与该线程绑定的子对象池。
通过利用本发明提供的方法和设备,可以解决当多个线程访问对象池出现的锁争用问题,从而克服编程开发过程中出现的性能瓶颈,另外本发明也同样解决由于生产者-消费者模型所带来的问题,更好地实现了对象池的均衡和共享。
附图说明
通过以下结合附图的说明,并且随着对本发明的更全面了解,本发明的其他目的和效果将变得更加清楚和易于理解,其中:
图1是示出现有技术的多个线程对单个全局对象池进行访问的示意图;
图2是示出现有技术的多个线程对多个对象池进行访问的示意图;
图3是示出根据本发明实施方式的将多个线程通过映射表与全局对象池中的多个子对象池进行一对一绑定的方法的示意图;
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于国际商业机器公司,未经国际商业机器公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/200810098476.8/2.html,转载请声明来源钻瓜专利网。