Objective c 更改@synchronized节内的锁定对象

Objective c 更改@synchronized节内的锁定对象,objective-c,synchronization,Objective C,Synchronization,我可以做以下任何一项吗?他们会正确锁定/解锁同一对象吗?为什么?假设有许多相同的线程使用全局变量“obj”,该变量是在所有线程启动之前初始化的 一, 二, 简短回答:不,它们不会正确锁定/解锁,应该避免这种方法 我的第一个问题是为什么要这样做,因为这些方法一开始就否定了使用@synchronized块的目的和好处 在第二个示例中,一旦线程更改了obj的值,到达@synchronized块的每个后续线程都将在新对象上同步,而不是在原始对象上同步。对于N个线程,您将显式创建N个自动释放对象,运行时最

我可以做以下任何一项吗?他们会正确锁定/解锁同一对象吗?为什么?假设有许多相同的线程使用全局变量“obj”,该变量是在所有线程启动之前初始化的

一,

二,


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

我的第一个问题是为什么要这样做,因为这些方法一开始就否定了使用@synchronized块的目的和好处

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

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


老实说,我并不想说得太苛刻,因为我想你可能只是对这个结构感到好奇。我这样说只是为了(希望)防止您和其他人编写有致命缺陷的代码,特别是在假设代码正确同步的情况下。祝你好运

注意:在阅读了这篇文章之后,我决定对@synchronized进行更彻底的调查,并在上面写一篇博文。你可能会发现它很有用:@rjkaplan你的链接断了,当,谢谢@RicardoAlves。这是一个有效的例子:(很遗憾,我无法编辑上面的评论)在我的特殊情况下(我找到这个Q/a的原因),我想做一些类似的事情(对不起,评论中没有好的格式)
@synchornized(obj){if(obj!=nil){…[做事,剪断];obj=nil}}
(*注意:*我在ARC下,所以我免费获得我的
发行版
。我想要的是,如果有一个obj,在我乱搞的时候同步它。如果没有,我真的不在乎。
@synchronized(obj) {
    [obj release];
    obj = nil;
}
@synchronized(obj) {
    obj = [[NSObject new] autorelease];
}