1.创建一个对象池

对象池:对象池一般用来管理一组可重用的对象, 这些对象的集合叫做对象池。 组件可以从对象池中借用对象, 完成一些任务之后将它归还给对象池。 返回的对象用于满足调用组件的后续请求, 请求可以来自一个组件, 也可以来自多个组件。

要实现这样一个功能, 需要注意两点: 1.处理好并发请求;2.确保每次请求都能获取到对象。

对于第一个问题, 可以使用同步队列, 进行并发保护。

对于第二个问题, 可以使用DispatchSemaphore来控制信号量,如果数组中有值则进入队列取值,如果没有可用对象则等待一直到有可用对象。

一个简单的对象池的实现方案如下所示:

class Pool<T> {
private var data = [T]()
private var arrayQueue = dispatch_queue_serial_t(label: "arrayQ")
private var semaphore: DispatchSemaphore init(items: [T]) {
data.reserveCapacity(items.count)
data.append(contentsOf: items)
semaphore = DispatchSemaphore(value: items.count)
} func getItemFromPool() -> T {
var result: T?
if semaphore.wait(timeout: DispatchTime.distantFuture) == 0 {
arrayQueue.sync {
result = data.popLast()
}
}
} func returnToPool(item: T) {
arrayQueue.async {
self.data.append(contentsOf: item)
semaphore.signal()
}
}
}

2: DispatchSemaphore

DispatchSemaphore信号量类型还是比较简单的,

open class DispatchSemaphore : DispatchObject {
} /// dispatch_semaphore
extension DispatchSemaphore {
//提高信号量
public func signal() -> Int
//等待降低信号量
public func wait() public func wait(timeout: DispatchTime) -> DispatchTimeoutResult public func wait(wallTimeout: DispatchWallTime) -> DispatchTimeoutResult
} extension DispatchSemaphore {
//创建信号量,参数:信号量的初值,如果小于0则会返回NULL
@available(iOS 4.0, *)
public /*not inherited*/ init(value: Int)
}

swift实现一个对象池的更多相关文章

  1. 设计一个对象池(Anno.XObjectPool)

    设计一个.net对象池   对象池对于创建开销比较大的对象来说很有意义,为了优化程序的运行速度.避免频繁创建销毁开销比较大的对象,我们可以通过对象池来复用创建开销大的对象.对象池的思路比较简单,事先创 ...

  2. [Swift] 创建一个对象

    创建一个对象 先写一个People类 // // People.swift // Class // // Created by YouXianMing on 15/3/18. // Copyright ...

  3. C3p0连接池配置

    在Java开发中,使用JDBC操作数据库的四个步骤如下:   ①加载数据库驱动程序(Class.forName("数据库驱动类");)   ②连接数据库(Connection co ...

  4. Java--对象池化技术 org.apache.commons.pool2.ObjectPool

    org.apache.commons.pool2.ObjectPool提供了对象池,开发的小伙伴们可以直接使用来构建一个对象池 使用该对象池具有两个简单的步骤: 1.创建对象工厂,org.apache ...

  5. 线程池ThreadPool的初探

    一.线程池的适用范围 在日常使用多线程开发的时候,一般都构造一个Thread示例,然后调用Start使之执行.如果一个线程它大部分时间花费在等待某个事件响应的发生然后才予以响应:或者如果在一定期间内重 ...

  6. Java-对象池

    对象池使用的基本思路是:将用过的对象保存起来,等下一次需要这种对象的时候,再拿出来重复使用,从而在一定程度上减少频繁创建对象所造成的开销. 并非所有对象都适合拿来池化――因为维护对象池也要造成一定开销 ...

  7. Java之对象池

    单例模式是限制了一个类只能有一个实例,对象池模式则是限制一个类实例的个数.对象池类就像是一个对象管理员,它以Static列表(也就是装对象的池子)的形式存存储某个实例数受限的类的实例,每一个实例还要加 ...

  8. 【h5-egret】深入浅出对象池

    最近看到对象池这一块的东西,是频繁创建和删除类型游戏优化性能的一个解决方案. 简单来讲对象池就是个数组,把不用的对象放进去,因为数组还保存了对象的引用,所以对象不会被回收,等需要用的时候再从数组中取出 ...

  9. 用Java实现一个通用并发对象池

    这篇文章里我们主要讨论下如何在Java里实现一个对象池.最近几年,Java虚拟机的性能在各方面都得到了极大的提升,因此对大多数对象而言,已经没有必要通过对象池来提高性能了.根本的原因是,创建一个新的对 ...

随机推荐

  1. Java 文件上传与下载、email

    1. 文件上传与下载 1.1 文件上传 文件上传,要点: 前台: 1. 提交方式:post 2. 表单中有文件上传的表单项: <input type="file" /> ...

  2. ArcGIS DataStore手册——入门篇

    第一章:ArcGIS DataStore入门 1.ArcGIS DataStore简介 ArcGIS DataStore是ArcGIS10.3推出来的一个全新的组件,它是一个关系型数据库管理系统,用于 ...

  3. Winform访问本地SQLServer数据库文件

    Winform访问本地SQLServer数据库文件 1.项目中添加config配置,如下: <configuration> <connectionStrings> <ad ...

  4. mongodb使用mongos链接复制集

    我们知道mongodb现在生产环境大部分还是使用的复制集来作为主流,据我了解.很多公司现在都是使用复制集的方式,而我们通过mongos可以巧妙的解决链接的问题,我们先从环境说起: 首先我们要模仿搭建的 ...

  5. JavaWeb笔记——MVC设计模式和JavaWeb经典三层架

    1 MVC设计模式 MVC设计模式 MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(C ...

  6. iOS文件处理类

    iOS文件处理类 这是一个用来简化iOS中关于文件操作的一个类,所有方法都为类方法. Source File.h // // File.h // FileManager // // http://ho ...

  7. linux防火墙放行了端口,但是仍然访问不到

    我们的防火墙默认规则如下: 如果防火墙放行了端口,但是仍然访问不到的话,可能是因为添加规则的时候,用的是iptables -A 选项,这样,增加的规则会排列在 第6条 规则后面,虽然service i ...

  8. 【深入理解JAVA虚拟机】第二部分.内存自动管理机制.4.JVM工具

    1.概述 工具作用:性能监控与故障处理 工作原理:分析数据 数据包含:运行日志. 异常堆栈. GC日志. 线程快照(threaddump/javacore文件). 堆转储快照(heapdump/hpr ...

  9. February 5 2017 Week 6 Sunday

    Prosperity discovers vice, adversity virtue. 得意时露瑕疵,逆境中见品质. Adversity will discover your virtue, not ...

  10. Oracle拆分字符串,字符串分割的函数。

    第一种:oracle字符串分割和提取 分割 create or replace function Get_StrArrayLength ( av_str varchar2, --要分割的字符串 av_ ...