gpt4 book ai didi

swift - 支持属性是否比 Swift 中的(惰性)更安全?

转载 作者:可可西里 更新时间:2023-11-01 00:52:49 24 4
gpt4 key购买 nike

使用由另一个属性支持的计算属性是否比在 Swift 中使用 lazy 修饰符更安全?

// method 1: using LAZY variable
lazy var myVar:Int {
// assume that this calculation takes
// a lot of time and resources
return 5
}

现在考虑 Apple 的 Swift 2(预发行版)中的以下引述:

NOTE

If a property marked with the lazy modifier is accessed by multiple threads simultaneously and the property has not yet been initialized, there is no guarantee that the property will be initialized only once.

就个人而言,我一直在做我自己的“懒惰”逻辑:

考虑替代方法:

// method 2: using calculated property backed by another property
var myVar:Int? {
if self._myVar != nil {
return self._myVar
}
let aVar:Int = 5 // assume this is done after exhaustive calcuation
self._myVar = aVar
return self._myVar
}

var _myVar:Int? = nil

使用(方法2),我能保证“穷举计算”只会执行一次吗?

最佳答案

您提出的方法 2 不能保证 lazy 不能保证的任何事情。

// method 2: using calculated property backed by another property
var myVar:Int? {
if self._myVar != nil {
return self._myVar
}
let aVar:Int = 5 // assume this is done after exhaustive calcuation
self._myVar = aVar
return self._myVar
}

var _myVar:Int? = nil

此外,它还有一个额外的缺陷,那就是它是可选的而不是非可选的。作为隐式解包的可选项,这会稍微好一点,这样我们就不必不断地解包它。

而且,我们不能设置myVar。另外 _myVar 应该是私有(private)的。

但问题是您没有锁定初始化代码以进行同步。

假设您有线程 A 开始访问 myVarif self._myVar != nil 检查返回 false,因此我们不会返回 self._myVar。现在我们进入详尽的计算。

现在,在穷举计算完成之前,线程 B 尝试访问 myVar。因为线程A还没有穷举完,if self._myVar != nil还是返回false,现在线程B做穷举。

本质上,这与 lazy 关键字给你带来的问题是一样的……但是当 lazy 时,你写了很多代码来这样做就足够了。

关于swift - 支持属性是否比 Swift 中的(惰性)更安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31367715/

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