2011-06-11 119 views
75

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

+1

http://stackoverflow.com/q/6234344/277952可能的重复? – NSGod 2011-06-11 19:14:09

回答

103

它在代码块周围声明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作为锁定对象,则根本不会执行锁定。

+12

有几点需要注意:1)如果你在'@ synchronized'中使用了一个零指针,它什么都不做 - 你不受保护。 2)'@ synchronized'是* slow *。 – 2013-07-27 13:02:06

+0

这个答案是误导性的,不应该被接受的答案。尽管它所说的有时是正确的(只要传递给* synhronized *的令牌在所有线程中都是同一个对象),它就会误导性地不完整。 * synchronized *可以防止同时执行任何数量的关联代码段,而不仅仅是“块中的代码”。参数* synchronized *有效地确定哪些代码段(或称为“块”作为回答调用它们)受到保护而不受并发访问的影响。 – Arda 2017-03-20 17:20:29

+0

@Arda你是完全正确的。我已经添加了一些更多信息和一些关于'@ synchronized'的Apple文档的链接。 – 2017-03-22 03:19:35

42

从Apple文档herehere

的@Synchronized指令是在Objective-C代码动态创建互斥锁 一个 便捷的方式。 @synchronized指令执行任何其他互斥锁都会执行的操作 - 它会阻止不同线程同时获取相同的锁。

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

25

@synchronized指令是一种方便快捷的方式在Objective-C代码中创建互斥锁。

@synchronized指令执行其他任何互斥锁都会执行的操作 - 它可以防止不同线程同时获取同一个锁。

语法:

@synchronized(key) 
{ 
    // thread-safe code 
} 

实施例:

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

现在上面的代码是完全线程safe..Now多个线程可以改变数值。

上面的仅仅是一个例子晦涩...

+3

不应该是@synchronized(oldValue)吗? – Joel 2014-09-08 16:37:37

+0

甚至是'@synchronized(val,oldValue){...}'? – 2014-10-12 10:29:10

+0

我不知道我见过任何“完美线程安全”的方案。至少你需要知道你在做什么,而不是盲目地从某个地方复制代码。 – 2015-01-25 14:54:27

0

@synchronizedthread safe机制。在这个函数中写入的代码成为critical section的一部分,一次只能执行一个线程。

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

它只保证线程安全,不能保证。我的意思是你为你的汽车聘请了一位专家司机,但它并不能保证汽车不会遇到事故。然而,可能性仍然是丝毫的。

+1

这是完全错误的。 dispatch_once不会和@syncrhonized一样,它可以是一个单独的分配下的替代品。 – jugutier 2016-08-22 21:32:28