阻止@synchronized

发布于 2024-12-04 19:03:37 字数 316 浏览 0 评论 0原文

在 @synchronized 内执行块似乎会取消锁定。

- (void)method {
    @synchronized(self) {
        if(ivar == nil) {
            ivar = [myBlock() retain];
        }
    }
}

实例变量ivar未写入任何其他位置。

我观察到块 myBlock 有时在我的应用程序中执行两次。

怎么会发生这种事呢?如何避免这种情况并进行真正的工作锁定?

Executing a block inside @synchronized seems to negate the lock.

- (void)method {
    @synchronized(self) {
        if(ivar == nil) {
            ivar = [myBlock() retain];
        }
    }
}

The instance variable ivar is not written in any other location.

I've observed that the block myBlock sometimes is executed twice in my application.

How can this ever happen? How to avoid this an do a real working lock?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

┈┾☆殇 2024-12-11 19:03:37

也许你可以移动块内的锁。

Maybe you could move the locking inside the block.

北城孤痞 2024-12-11 19:03:37

该锁工作正常,因为synchronized仅锁定线程,并且同一线程访问该区域两次。问题是,myBlock 在某些情况下会在内部执行自身。

The lock worked fine as synchronized locks only threads, and the same thread was accessing the region twice. The problem was, that myBlock executed itself inside under some circumstances.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文