- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
这里是示例代码的链接 http://developer.apple.com/library/ios/#samplecode/MVCNetworking/Introduction/Intro.html
下面是文件 NetworkManager.m 中的代码片段
+ (NetworkManager *)sharedManager
// See comment in header.
{
static NetworkManager * sNetworkManager;
// This can be called on any thread, so we synchronise. We only do this in
// the sNetworkManager case because, once sNetworkManager goes non-nil, it can
// never go nil again.
if (sNetworkManager == nil) {
@synchronized (self) {
sNetworkManager = [[NetworkManager alloc] init];
assert(sNetworkManager != nil);
}
}
return sNetworkManager;
}
显然这里存在线程安全问题。当有多个线程时,可能会创建两个 NetworkManager 实例。所以 Apple 犯了一个错误,对吧?
最佳答案
是的,你是对的。它会在并发环境中出现问题。更好的方法是在 alloc
之前使用双重检查:
+ (NetworkManager *)sharedManager
{
static NetworkManager * sNetworkManager;
if (sNetworkManager == nil) {
@synchronized (self) {
if (sNetworkManager == nil) {
sNetworkManager = [[NetworkManager alloc] init];
assert(sNetworkManager != nil);
}
}
}
return sNetworkManager;
}
而且有很多方法可以使用 Ojbective-C 编写单例,查看这篇文章:What should my Objective-C singleton look like?
更新
BobCromwell
是对的。 double check lock
苹果不推荐,苹果Threading Programming Guide
中的文档:
A double-checked lock is an attempt to reduce the overhead of taking a lock by testing the locking criteria prior to taking the lock. Because double-checked locks are potentially unsafe, the system does not provide explicit support for them and their use is discouraged.`
关于objective-c - Apple 的 Sample MVCNetworking 中的 Singleton Class NetworkManager 是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10039700/
这里是示例代码的链接 http://developer.apple.com/library/ios/#samplecode/MVCNetworking/Introduction/Intro.html
我是一名优秀的程序员,十分优秀!