单例核心点

Posted 追风远航

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单例核心点相关的知识,希望对你有一定的参考价值。

1. 构造方法是私有的 private

2. 单例方法getInstance 是 public 的 保证对外能公开访问

3.单例的方法getInstance 是 static 的, 保证 方法无需实例化获取方法, 在类加载时就已创建.

 

扩展点:

1. 使用枚举方式的 构建单例

2. 双重锁定时什么样的情况

单例的每个核心设计的 IO 服务

【中文标题】单例的每个核心设计的 IO 服务【英文标题】:IO Service per core design with singleton 【发布时间】:2014-04-19 10:38:08 【问题描述】:

我目前正在开发游戏服务器,目前我有一个设计问题。

游戏服务器有 World 类(它是单例的),当我从单一 I/O 服务更改为每个核心的 I/O 服务时,我认为我应该在我的 World 类中使用互斥锁。 因为来自客户端的数据包处理程序有时会使用 World 的函数执行操作。

有没有办法避免单例中的互斥锁?

【问题讨论】:

好吧,如果从多个线程中使用,不要使用会破坏事物的代码? :) 实际上,在进入多线程模式之前实例化你的单例是一个很好的做法,在应用程序开始附近的某个地方。然后你应该在确实需要的地方使用锁。如果不了解您的服务逻辑,就很难提出更准确的建议。 【参考方案1】:

您可以使用主动对象模式。

所以让 World 实现成为一个活动对象,实际上在它自己的线程上运行所有操作。

Boost Asio 的主动对象模式示例在这里:boost::asio and Active Object

将 World 设为活动对象是否(在性能方面)合适,我无法判断。我有一种感觉,你应该/简单地/不要从许多线程访问 World,而是只在不需要锁来协调的后台运行计算密集型的东西,或者在锁定开销不重要的地方。

在我的 comment here 中,我展示了一种通过无锁队列实现调度作业的替代方法。

【讨论】:

以上是关于单例核心点的主要内容,如果未能解决你的问题,请参考以下文章

单例的每个核心设计的 IO 服务

带有核心数据对象的 NSArray 的单例 null

单例设计模式

iOS - 核心数据堆栈作为带有主 NSManagedObjectContext 的单例

java 核心学习笔记 单例类

单例核心数据管理器可用于所有 UINavigationController 嵌入式视图