改变@Synchronized部内的锁定对象(Changing the locking object

2019-06-27 11:19发布

我可以做任何以下吗? 他们会正确地锁定/解锁同一个对象? 为什么或者为什么不? 假设有许多相同的线程使用全局变量“目标文件”,所有的线程启动前被初始化。

1。

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

2。

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

Answer 1:

简短的回答:不,他们将无法正常锁定/解锁,并且应该避免这样的方法。

我的第一个问题是,为什么你会想要做这样的事情,因为这些方法抵消的目的,首先使用@Synchronized块的好处。

在第二个例子中,一旦一个线程改变的价值obj ,到达@Synchronized块将新的对象,而不是原来的对象上同步以后每线程。 对于N个线程,你会很明确地创建N个自动释放的对象,并且运行时最多可以创建与这些对象相关的氮递归锁。 换出在其上的关键部分内实现同步的对象是线程安全的并发的一个基本禁忌。 不这样做。 永远。 如果多个线程可以安全地并发访问块,只是省略完全是@synchronized。

在你的第一个例子中,结果可能是不确定的,肯定不是你想要的,无论是。 如果运行时只使用对象的指针找到相关的锁,该代码可以运行良好,但在同步nil在我简单的试验没有明显的效果,如此反复你在一个毫无意义的方式使用@synchronized,因为它没有提供保护任何责任。

我老老实实并不想成为严酷的,因为我想你可能只是好奇的结构。 我只是这个措辞强烈(希望)防止你和其他人编写的代码是致命的缺陷,尤其是在假设条件下,它同步正确。 祝好运!



文章来源: Changing the locking object inside @synchronized section