更改@synchronized部分内的锁定对象

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)

Qui*_*lor 9

简答:不,他们不会正确锁定/解锁,应该避免这种方法.

我的第一个问题是为什么你想要做这样的事情,因为这些方法首先取消了使用@synchronized块的目的和好处.

在第二个示例中,一旦线程更改了值obj,到达@synchronized块的每个后续线程将在新对象上同步,而不是原始对象.对于N个线程,您将显式创建N个自动释放的对象,并且运行时可以创建与这些对象关联的N个递归锁.在关键部分中交换您在其上同步的对象是线程安全并发的基本禁忌.不要这样做.永远.如果多个线程可以安全地同时访问块,则只需完全省略@synchronized.

在您的第一个示例中,结果可能未定义,当然也不是您想要的结果.如果运行时只使用对象指针来查找关联的锁,那么代码可能运行正常,但是同步nil在我的简单测试中没有可察觉的效果,所以再次以无意义的方式使用@synchronized,因为它没有提供保护任何.

老实说,我并不是要苛刻,因为我觉得你可能只是对这个结构感到好奇.我只是强烈地措辞(希望)阻止你和其他人编写具有致命缺陷的代码,特别是如果假设它正确同步的话.祝好运!