我刚刚创建了一个单例方法,我想知道函数@synchronized()
做什么,因为我经常使用它,但不知道含义。@synchronized()做了什么?
回答
它在代码块周围声明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)如果你在'@ synchronized'中使用了一个零指针,它什么都不做 - 你不受保护。 2)'@ synchronized'是* slow *。 – 2013-07-27 13:02:06
这个答案是误导性的,不应该被接受的答案。尽管它所说的有时是正确的(只要传递给* synhronized *的令牌在所有线程中都是同一个对象),它就会误导性地不完整。 * synchronized *可以防止同时执行任何数量的关联代码段,而不仅仅是“块中的代码”。参数* synchronized *有效地确定哪些代码段(或称为“块”作为回答调用它们)受到保护而不受并发访问的影响。 – Arda 2017-03-20 17:20:29
@Arda你是完全正确的。我已经添加了一些更多信息和一些关于'@ synchronized'的Apple文档的链接。 – 2017-03-22 03:19:35
@同步块会自动为您锁定和解锁。 @synchronize 您有一个隐含的锁与您用于同步的对象相关联。下面是关于这个主题非常丰富的讨论,请遵循How does @synchronized lock/unlock in Objective-C?
@synchronized
指令是一种方便快捷的方式在Objective-C代码中创建互斥锁。
@synchronized
指令执行其他任何互斥锁都会执行的操作 - 它可以防止不同线程同时获取同一个锁。
语法:
@synchronized(key)
{
// thread-safe code
}
实施例:
-(void)AppendExisting:(NSString*)val
{
@synchronized (oldValue) {
[oldValue stringByAppendingFormat:@"-%@",val];
}
}
现在上面的代码是完全线程safe..Now多个线程可以改变数值。
上面的仅仅是一个例子晦涩...
不应该是@synchronized(oldValue)吗? – Joel 2014-09-08 16:37:37
甚至是'@synchronized(val,oldValue){...}'? – 2014-10-12 10:29:10
我不知道我见过任何“完美线程安全”的方案。至少你需要知道你在做什么,而不是盲目地从某个地方复制代码。 – 2015-01-25 14:54:27
@synchronized
是thread safe
机制。在这个函数中写入的代码成为critical section
的一部分,一次只能执行一个线程。
@synchronize
隐式应用锁,而NSLock
明确应用它。
它只保证线程安全,不能保证。我的意思是你为你的汽车聘请了一位专家司机,但它并不能保证汽车不会遇到事故。然而,可能性仍然是丝毫的。
这是完全错误的。 dispatch_once不会和@syncrhonized一样,它可以是一个单独的分配下的替代品。 – jugutier 2016-08-22 21:32:28
- 1. 什么是synchronized()/ wait()/ notifyAll()在Java中做什么?
- 2. synchronized(this)和synchronized(ClassName.class)有什么区别?
- 3. `tf.strided_slice()`做了什么?
- 4. L做了什么?
- 5. logging.basicConfig做了什么?
- 6. class_initialize()做了什么?
- 7. select {}做了什么?
- 8. 什么做错了?
- 9. 是什么@synchronized平均
- 10. 为什么synchronized(this)有效?
- 11. `kill(0,SIGINT)`做了什么?
- 12. #!perl究竟做了什么?
- 13. IOErrorEvent ....我做错了什么?
- 14. launch4j到底做了什么?
- 15. document.normalize究竟做了什么?
- 16. “uniquetol”究竟做了什么?
- 17. EwfSysprepSpecialize究竟做了什么?
- 18. UserTransactionManager究竟做了什么
- 19. dojo/domReady做了什么?
- 20. Python:我做错了什么?
- 21. 你用Object.clone()做了什么?
- 22. git - 我做了什么?
- 23. Python:我做错了什么
- 24. apt-get purge做了什么?
- 25. C++,我做错了什么?
- 26. Javascript:我做错了什么?
- 27. __block究竟做了什么?
- 28. 我做错了什么?
- 29. offsetLeftAndRight()究竟做了什么?
- 30. runtime.Gosched究竟做了什么?
http://stackoverflow.com/q/6234344/277952可能的重复? – NSGod 2011-06-11 19:14:09