我已经阅读了一些外国代码中的内容,我想检查一下我的假设:
@synchronized(self)
用于在设置属性时删除self
前缀。
所以在下面的例子中,我正在设置实例的strText
,而不仅仅是局部变量,对吗?
- (void)myfunction{
NSString * strText = @"var in function";
@synchronized(self)
{
strText = @"var class (self.strText)";
}
}
答案 0 :(得分:41)
请阅读此Documentation
@synchronized()
指令锁定一段代码以供a使用 单线程。其他线程被阻塞,直到线程退出 受保护的代码 - 即执行继续执行最后一次@synchronized()
块中的语句。
@synchronized()
指令作为唯一参数any Objective-C对象,包括self
。
作为Massimo Cafaro pointed out: “在应用程序变为多线程之前创建所有互斥对象是最安全的,以避免竞争条件。”
答案 1 :(得分:8)
@synchronized(self)用于摆脱自我。前缀。
所以在我的例子中,我将strText设置为不在我设置的函数中 类。
正在混淆两个概念。
@synchronized(self) { ... }
仅使用self
对象作为信号量锁定块。with
语句,因此self.whatever
只需要whatever
。可能想通过斯坦福CS193P在线课程来学习语言。答案 2 :(得分:0)
在多线程环境中,如果有多个线程尝试访问 相同的内存地址可能会导致“种族状况”,以避免这种情况 您应该使用“互斥锁(互斥)”的条件 但阻止或限制或锁定n个要访问的线程 在同一时间点具有相同的内存地址或内容,并允许 在某个时间实例中只有一个线程。这可以通过以下方式实现 通过使用@synchronized指令来实现目标C。
示例: 通常,在实现Singleton设计模式或类时,您会在任何iOS项目中看到如下所示的代码段,
+(id)getSingletonInstance
{
@synchronized(self)
{
if (singletonObj == nil)
{
singletonObj = [[self alloc] init];
}
return singletonObj;
}
}