gpt4 book ai didi

objective-c - 更改@synchronized 部分中的锁定对象

转载 作者:太空狗 更新时间:2023-10-30 03:42:09 25 4
gpt4 key购买 nike

我可以执行以下任一操作吗?他们会正确地锁定/解锁同一个对象吗?为什么或者为什么不?假设有许多相同的线程使用全局变量“obj”,该变量在所有线程启动之前被初始化。

1.

@synchronized(obj) {
[obj release];
obj = nil;
}

2.

@synchronized(obj) {
obj = [[NSObject new] autorelease];
}

最佳答案

简短回答:不,它们无法正确锁定/解锁,应避免此类方法。

我的第一个问题是您为什么要这样做,因为这些方法首先抵消了使用 @synchronized block 的目的和好处。

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

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

老实说,我并不是要刻薄,因为我认为您可能只是对构造感到好奇。我只是用强烈的措辞(希望)防止您和其他人编写有致命缺陷的代码,尤其是在假设它正确同步的情况下。祝你好运!

关于objective-c - 更改@synchronized 部分中的锁定对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1215765/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com