对象池学习

概念

为了避免大量创建(构造)对象、销毁(析构)对象带的性能开销

设计

  • 对象队列

    • 初始化时,指定队列长度
    • 出队、入队操作需要加锁保护
    • 对象的构造
      • 在初始化对象池时构造好
      • 对象并不是一开始全部构造好,而是在获取对象的过程中构造(构造之后便保存在队列中供使用)
  • 获取对象
    • 提供接口
  • 归还对象
    • 提供接口,显示归还
    • 利用c++ RAII特性(即智能指针析构时,调用归还操作),隐式归还
  • 对象管理器
    • 负责构造对象与销毁对象
    • 管理每个对象的状态
  • 获取状态接口
    • 提供接口,用户可以获取对象池的各种状态信息

注意事项

  • 对象池的更新

    • 对象构造时可能需要特定的参数,运行时参数发生改变从而需要更新对象池时,需要 用户 保证在更新过程中访问对象操作的线程安全性,下面是一种方案(更新整个对象池实例):

      • 用户 使用智能指针持有对象池实例,并且使用读写锁保护其访问操作

        • 使用智能指针可以在更新操作发生后提供对原对象池实例的线程安全访问
        • 使用智能指针可以发生更新操作(加写锁,阻塞)时只执行智能指针的赋值
      • 用户 根据需要构造一个新的对象池实例,初始化成功后,加写锁替换原对象池实例

cpp object pool 项目

https://github.com/chenguang9239/generic_object_pool.git

原文地址:https://www.cnblogs.com/wangzhiyi/p/11565051.html

时间: 2024-10-06 00:22:29

对象池学习的相关文章

【Todo】Apache-Commons-Pool及对象池学习

有这篇文章: http://www.cnblogs.com/tommyli/p/3510095.html 方案提供了三种类型的pool,分别是GenericKeyedObjectPool,SoftReferenceObjectPool和GenericObjectPool.其中GenericObjectPool是一般意义上的对象池:SoftReferenceObjectPool是弱引用的对象池:GenericKeyedObjectPool是具备分组的对象池.

java/android 设计模式学习笔记(5)---对象池模式

这次要介绍一下对象池模式(Object Pool Pattern),这个模式为常见 23 种设计模式之外的设计模式,介绍的初衷主要是在平时的 android 开发中经常会看到,比如 ThreadPool 和 MessagePool 等. 在 java 中,所有对象的内存由虚拟机管理,所以在某些情况下,需要频繁创建一些生命周期很短使用完之后就可以立即销毁,但是数量很大的对象集合,那么此时 GC 的次数必然会增加,这时候为了减小系统 GC 的压力,对象池模式就很适用了.对象池模式也是创建型模式之一,

go语言学习--go的临时对象池--sync.Pool

一个sync.Pool对象就是一组临时对象的集合.Pool是协程安全的. Pool用于存储那些被分配了但是没有被使用,而未来可能会使用的值,以减小垃圾回收的压力.一个比较好的例子是fmt包,fmt包总是需要使用一些[]byte之类的对象,golang建立了一个临时对象池,存放着这些对象,如果需要使用一个[]byte,就去Pool里面拿,如果拿不到就分配一份. 这比起不停生成新的[]byte,用完了再等待gc回收来要高效得多. type buffer []byte // pp是用于存储printe

Unity 对象池的使用

在游戏开发过程中,我们经常会遇到游戏发布后,测试时玩着玩着明显的感觉到有卡顿现象.出现这种现象的有两个原因:一是游戏优化的不够好或者游戏逻辑本身设计的就有问题,二是手机硬件不行.好吧,对于作为程序员的我们只能从第一个原因着手了,那就开始对着Profiler看性能开销,接下来就开始做各种内存,特效,代码上的优化了.对于这种问题,有经验的开发者在一开始就会做一个规范的设计,就我们的项目而言,设计时包含了角色池,怪物池,特效池,经验池,伤害池......所谓的对象池就是尽可能的复用内存中已经驻留的资源

多线程及线程池学习心得

一.线程的应用与特点 多线程是程序员不可或缺的技术能力,多线程技术在各个方面都有应用,特别在性能优化上更是起到至关重要的作用.但是,如果多线程写得不好,往往会适得其反,特别是高并发时会造成阻塞.超时等现象.多线程具有以下特点:1.独立性,拥有自己独立的资源,拥有自己私有的地址空间:2.动态性,进程具有自己的生命周期和各种不同的状态:3.并发性,多个进程可以在单个处理器上并发执行,不会相互影响,并行是指同一时刻有多条指令在多个处理器上同时执行.线程是进程的组成部分,一个进程可以拥有多个线程,一个线

Android多线程编程之线程池学习篇(一)

Android多线程编程之线程池学习篇(一) 一.前言 Android应用开发中多线程编程应用比较广泛,而应用比较多的是ThreadPoolExecutor,AsyncTask,IntentService,HandlerThread,AsyncTaskLoader等,为了更详细的分析每一种实现方式,将单独成篇分析.后续篇章中可能涉及到线程池的知识,特此本篇分析为何使用线程池,如何使用线程池以及线程池的使用原理. 二.Thread Pool基础 进程代表一个运行中的程序,一个运行中的Android

对象池方案总结

最近项目涉及到大量数据并发的问题,短时间内会产生和销毁大量对象,因此担心会不会影响系统的性能,考虑使用对象池的方案. 但是在对对象池的学习中,对于是否使用对象池产生的疑问. MSDN中 “How to: Create an Object Pool by Using a ConcurrentBag”(https://msdn.microsoft.com/en-us/library/ff458671.aspx)一文中提到 “Object pools can improve application p

大数据技术之_27_电商平台数据分析项目_02_预备知识 + Scala + Spark Core + Spark SQL + Spark Streaming + Java 对象池

第0章 预备知识0.1 Scala0.1.1 Scala 操作符0.1.2 拉链操作0.2 Spark Core0.2.1 Spark RDD 持久化0.2.2 Spark 共享变量0.3 Spark SQL0.3.1 RDD.DataFrame 与 DataSet0.3.2 DataSet 与 RDD 互操作0.3.3 RDD.DataFrame 与 DataSet 之间的转换0.3.4 用户自定义聚合函数(UDAF)0.3.5 开窗函数0.4 Spark Streaming0.4.1 Dst

【基础】Java 8 中的常量池、字符串池、包装类对象池

1 - 引言 2 - 常量池 2.1 你真的懂 Java的“字面量”和“常量”吗? 2.2 常量和静态/运行时常量池有什么关系?什么是常量池? 2.3 字节码下的常量池以及常量池的加载机制 2.4 是不是所有的数字字面量都会被存到常量池中?3 - 包装类对象池 $\ne$JVM 常量池4 - 字符串池 4.1 字符串池的实现——StringTable 4.2 字符串池存的是实例还是引用?5 - 补充 5.1 永久代为何被 HotSpot VM 废弃? 5.2 为什么 Java 要分常量.简单类型