我刚刚创建了一个单例方法,我想知道函数@synchronized()
的作用,因为我经常使用它,但不知道它的含义。
答案 0 :(得分:112)
它在代码块周围声明critical section。在多线程代码中,@synchronized
保证在任何给定时间只有一个线程可以在块中执行该代码。
如果您不知道它的作用,那么您的应用程序可能不是多线程的,您可能不需要使用它(特别是如果单例本身不是线程安全的)。
修改:添加一些2011年原始答案中没有的信息。
@synchronized
指令prevents multiple threads from entering any region of code that is protected by a @synchronized
directive referring to the same object。传递给@synchronized
指令的对象是用作“锁定”的对象。如果使用不同的对象作为锁,则两个线程可以位于相同的受保护的代码区域中,并且您还可以使用与锁相同的对象来保护两个完全不同的代码区域。
此外,如果您碰巧将nil
作为锁定对象传递,则根本不会进行锁定。
答案 1 :(得分:42)
@synchronized指令是一个 方便的方法来创建互斥锁 在Objective-C代码中动态实现。该 @synchronized指令执行任何操作 其他互斥锁会做 - 它会阻止 获得的不同线程 同时锁定。
该文档提供了有关此主题的大量信息。值得花时间阅读它,特别是考虑到你一直在使用它而不知道它在做什么。
答案 2 :(得分:25)
@synchronized
指令是一种在 Objective-C 代码中动态创建互斥锁的便捷方式。
@synchronized
指令执行任何其他互斥锁将执行的操作 - 它可以防止不同的线程同时获取相同的锁。
语法:
@synchronized(key)
{
// thread-safe code
}
示例:
-(void)AppendExisting:(NSString*)val
{
@synchronized (oldValue) {
[oldValue stringByAppendingFormat:@"-%@",val];
}
}
现在上面的代码是完全线程安全的..现在多个线程可以更改值。
以上只是一个不起眼的例子......
答案 3 :(得分:6)
@synchronized block自动为您处理锁定和解锁。 @synchronize 您有一个与您用于同步的对象关联的隐式锁。以下是关于此主题的非常丰富的讨论,请关注How does @synchronized lock/unlock in Objective-C?
答案 4 :(得分:4)
答案 5 :(得分:-2)
@synchronized
是thread safe
机制。在此函数内编写的代码片段成为critical section
的一部分,一次只能执行一个线程。
@synchronize
隐式应用锁定,而NSLock
明确应用锁定。
它只保证线程安全,而不是保证。我的意思是你为你的汽车聘请专家司机,但它并不能保证汽车不会遇到意外。然而,概率仍然是最轻微的。