Dav*_*Lin 6 synchronization objective-c
我可以做以下任何一项吗?他们会正确锁定/解锁同一个物体吗?为什么或者为什么不?假设有许多相同的线程使用全局变量"obj",它在所有线程启动之前被初始化.
1.
@synchronized(obj) {
[obj release];
obj = nil;
}
Run Code Online (Sandbox Code Playgroud)
2.
@synchronized(obj) {
obj = [[NSObject new] autorelease];
}
Run Code Online (Sandbox Code Playgroud)
简答:不,他们不会正确锁定/解锁,应该避免这种方法.
我的第一个问题是为什么你想要做这样的事情,因为这些方法首先取消了使用@synchronized块的目的和好处.
在第二个示例中,一旦线程更改了值obj,到达@synchronized块的每个后续线程将在新对象上同步,而不是原始对象.对于N个线程,您将显式创建N个自动释放的对象,并且运行时可以创建与这些对象关联的N个递归锁.在关键部分中交换您在其上同步的对象是线程安全并发的基本禁忌.不要这样做.永远.如果多个线程可以安全地同时访问块,则只需完全省略@synchronized.
在您的第一个示例中,结果可能未定义,当然也不是您想要的结果.如果运行时只使用对象指针来查找关联的锁,那么代码可能运行正常,但是同步nil在我的简单测试中没有可察觉的效果,所以再次以无意义的方式使用@synchronized,因为它没有提供保护任何.
老实说,我并不是要苛刻,因为我觉得你可能只是对这个结构感到好奇.我只是强烈地措辞(希望)阻止你和其他人编写具有致命缺陷的代码,特别是如果假设它正确同步的话.祝好运!
| 归档时间: |
|
| 查看次数: |
4169 次 |
| 最近记录: |