@synchronized()做了什么?

我只是创build了一个单例方法,我想知道@synchronized()函数做了什么,因为我经常使用这个方法,但是不知道意义。

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

如果你不知道它做了什么,那么你的应用程序可能不是multithreading的,你可能不需要使用它(特别是如果单例本身不是线程安全的)。


编辑:添加更多的信息,在2011年没有在原来的答案。

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

另外,如果你碰巧把nil作为锁对象,就根本不会锁。

从这里和这里的Apple文档:

@synchronized指令是在Objective-C代码中快速创build互斥锁的一种便捷方式。 @synchronized指令执行其他任何互斥锁都会执行的操作 – 它可以防止不同线程同时获取同一个锁。

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

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

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

句法:

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

例:

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

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

以上只是一个不为人知的例子…

@synchronized块自动处理你的locking和解锁 。 @synchronize你有一个隐含的锁与您用来同步的对象相关联。 这里是关于这个主题的非常丰富的讨论请遵循Objective-C中的@synchronized lock / unlock?

这里的优秀答案:

帮助理解返回单例的类方法

并进一步解释创build单例的过程。

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

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

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