@synchronized()做什么?

时间:2011-06-11 18:55:12

标签: objective-c ios cocoa-touch

我刚刚创建了一个单例方法,我想知道函数@synchronized()的作用,因为我经常使用它,但不知道它的含义。

6 个答案:

答案 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)

来自Apple文档herehere

  

@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)

这里的优秀答案:

Help understanding class method returning singleton

进一步解释了创建单身人士的过程。

答案 5 :(得分:-2)

@synchronizedthread safe机制。在此函数内编写的代码片段成为critical section的一部分,一次只能执行一个线程。

@synchronize隐式应用锁定,而NSLock明确应用锁定。

它只保证线程安全,而不是保证。我的意思是你为你的汽车聘请专家司机,但它并不能保证汽车不会遇到意外。然而,概率仍然是最轻微的。