【发布时间】:2015-03-30 07:02:09
【问题描述】:
在我们的应用程序中,我们在多个位置使用了单例,最近我查看并在所有单例方法中添加了@synchronized 命令,以确保它们是线程安全的。我的问题是调用这个有什么区别:
+ (RLReceiver *) getReceiver
{
static RLReceiver *receiverCache;
@synchronized(receiverCache)
{
if (!receiverCache )
receiverCache = [[RLReceiver alloc] init];
return receiverCache;
}
}
在这种情况下,我同步了 RLReceiver 类的静态实例,但我也看到了(而且编译器也允许这样做):
+ (RLReceiver *) getReceiver
{
static RLReceiver *receiverCache;
@synchronized(self)
{
if (!receiverCache )
receiverCache = [[RLReceiver alloc] init];
return receiverCache;
}
}
同步在self 上。这让我有点困惑,因为这个方法是一个类方法,在这个方法的这个范围内甚至不应该有self。任何人都可以阐明在这种情况下静态变量和 self 之间的区别是什么,以及在类方法中甚至会有 self 吗?
【问题讨论】:
-
第一个是第一次同步。第二个在对象的类对象上同步。 (不是 100% 确定这样做是合法的。)
-
使用
dispatch_once的方案之一可能更明智。
标签: objective-c thread-safety singleton synchronized