android - 我的单例可以被多次调用
问题描述
我已经实现了一个基于 c++ 11 的单例。但是在某些情况下可以多次调用构造函数。
该类将被编译为静态库并被其他so lib(多个so lib)使用。并且系统是多线程系统(运行在Android HAL级别)
/// .h 文件:
class Logger
{
public:
/// Return the singleton instance of Logger
static Logger& GetInstance() {
static Logger s_loggerSingleton;
return s_loggerSingleton;
}
private:
/// Constructor
Logger();
/// Destructor
~Logger();
}
/// .cpp 文件
Logger::Logger()
{
ALOGE("OfflineLogger create");
}
Logger::~Logger()
{
}
它应该创建一次,例如:
03-21 01:52:20.785 728 4522 E : OfflineLogger create
但是我可以看到它已经被创建了不止一次
03-21 01:52:20.785 728 4522 E : OfflineLogger create
03-21 01:52:20.863 728 2274 E : OfflineLogger create
03-21 01:52:20.977 728 2273 E : OfflineLogger create
03-21 01:52:26.370 728 4522 E : OfflineLogger create
问题:
我的单例设计有什么问题吗?这是一个线程安全的问题吗?
似乎我的单例在一个 so 范围内工作正常,但是包含我的单例的每个 so lib 都会创建自己的单例,因此我的单例不再是“单例”。问题是否由每个动态链接到 new so 和“静态变量”变成“本地静态”引起?可能吗?如果是这样,如何解决?
解决方案
- 我的单例设计有什么问题吗?这是一个线程安全的问题吗?
不可以。标准保证函数局部变量的初始化static
是线程安全的。
- 似乎我的单例在一个 so 范围内可以正常工作,但是包含我的单例的每个 so lib 都会创建自己的单例,因此我的单例不再是“单例”。问题是否由每个动态链接到新的 so 和“静态可验证”变成“本地静态”?可能吗?如果是这样,如何解决
这是正确的结论。
与其创建包含单例实现的静态库,不如将其设为动态库。
推荐阅读
- apache-spark - Spark MlLib (Java) 中的分类和数值特征
- java - Android 插件 3.0.0+ 数据绑定错误?
- apache-spark - Spark 中的 Drools - 性能
- php - 计算wordpress帖子的数量并回应它
- machine-learning - 如何在python中提取随机森林的决策规则
- javascript - 读取列表中特定元素的数据
- javascript - 在 javascript 文件中为 NodeJS 添加环境变量
- node.js - `$set` 可以替换 mongoDB 中 Boolean 类型的字段值吗?
- youtube-data-api - youtube-v3-api setModerationStatus 没有将其从拒绝更改为已发布
- c# - 从 C# wpf 执行 PowerShell 脚本