@synchronized()做什么?

max*_*ax_ 82 cocoa-touch objective-c ios

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

Joh*_*eek 114

它声明了代码块周围的关键部分.在多线程代码中,@synchronized保证在任何给定时间只有一个线程可以在块中执行该代码.

如果您不知道它的作用,那么您的应用程序可能不是多线程的,您可能不需要使用它(特别是如果单例本身不是线程安全的).


编辑:添加一些2011年原始答案中没有的信息.

@synchronized指令防止多个线程进入受引用同一对象@synchronized指令保护的任何代码区域.传递给@synchronized指令的对象是用作"锁定"的对象.如果使用不同的对象作为锁,则两个线程可以位于相同的受保护的代码区域中,并且您还可以使用与锁相同的对象来保护两个完全不同的代码区域.

此外,如果您碰巧nil作为锁定对象传递,则根本不会进行锁定.

  • 几个要点:1)如果你在`@ synchronized`中使用nil指针它什么都不做 - 你没有受到保护.2)`@ synchronized`是*慢*. (14认同)

csa*_*ano 42

这里这里的Apple文档:

@synchronized指令是一种在Objective-C代码中动态创建互斥锁的便捷方法.@synchronized指令执行任何其他互斥锁将执行的操作 - 它可以防止不同的线程同时获取相同的锁.

该文档提供了有关此主题的大量信息.值得花时间阅读它,特别是考虑到你一直在使用它而不知道它在做什么.


Dur*_*n.H 26

@synchronized指令是在Objective-C代码中动态创建互斥锁的便捷方式.

@synchronized指令执行任何其他互斥锁将执行的操作 - 它可以防止不同的线程同时获取相同的锁.

句法:

 @synchronized(key) 
 { 
  // thread-safe code 
 }
Run Code Online (Sandbox Code Playgroud)

例:

 -(void)AppendExisting:(NSString*)val
{
  @synchronized (oldValue) {
      [oldValue stringByAppendingFormat:@"-%@",val];
  }
}
Run Code Online (Sandbox Code Playgroud)

现在上面的代码是完全线程安全的..现在多个线程可以更改值.

以上只是一个不起眼的例子......

  • 它不应该是@synchronized(oldValue)吗? (3认同)

abd*_*.me 6

@synchronized块自动为您处理锁定和解锁.@synchronize您有一个与您用于同步的对象关联的隐式锁.这里有关于这个主题的非常丰富的讨论,请关注如何在Objective-C中@synchronized锁定/解锁?