我刚刚创建了一个单例方法,我想知道该函数的功能@synchronized()
,因为我经常使用它,但不知道其含义。
Answers:
它在代码块周围声明了一个关键部分。在多线程代码中,请@synchronized
确保在任何给定时间,只有一个线程可以在块中执行该代码。
如果您不知道它的作用,那么您的应用程序可能不是多线程的,并且您可能不需要使用它(特别是如果单例本身不是线程安全的)。
编辑:添加了一些其他信息,这些信息不在2011年的原始答案中。
该@synchronized
伪指令可防止多个线程进入任何受引用同一对象的@synchronized
伪指令保护的代码区域。传递给@synchronized
指令的对象是用作“锁”的对象。如果将不同的对象用作锁,则两个线程可以位于代码的同一受保护区域中,并且您也可以使用与锁相同的对象来保护两个完全不同的代码区域。
另外,如果你碰巧通过 nil
作为锁定对象,则将根本不会采取任何锁定。
@synchronized
。
该@synchronized
指令是在Objective-C代码中动态创建互斥锁的便捷方法。
该@synchronized
指令执行任何其他互斥锁将执行的操作-防止不同的线程同时获取同一锁。
句法:
@synchronized(key)
{
// thread-safe code
}
例:
-(void)AppendExisting:(NSString*)val
{
@synchronized (oldValue) {
[oldValue stringByAppendingFormat:@"-%@",val];
}
}
现在上面的代码是完全线程安全的。现在,多个线程可以更改值。
上面只是一个晦涩的例子...
@synchronized(val, oldValue) { ... }
?
@synchronized块会自动为您处理锁定和解锁。@synchronize您具有与要用于同步的对象关联的隐式锁。这是关于此主题的非常有用的讨论,请关注Objective-C中的@synchronized锁定/解锁如何进行?
@synchronized
是thread safe
机制。写入此函数内部的一段代码成为的一部分critical section
,一次只能执行一个线程。
@synchronize
隐式地应用锁,而NSLock
显式地应用锁。
它仅确保线程安全,而不能保证。我的意思是,您为汽车聘请了专业的驾驶员,但这仍然不能保证汽车不会发生事故。但是概率仍然是最小的。
@synchronized
则无济于事-您将失去保护。2)@synchronized
是慢。