【问题标题】:Is Property Wrapper @Lazy variable thread safe?Property Wrapper @Lazy 变量线程安全吗?
【发布时间】:2019-10-29 06:54:14
【问题描述】:

我们现在有了一种创建惰性变量的新方法。在swift-evolution/proposals/0258-property-wrappers.md中有描述:

@propertyWrapper
enum Lazy<Value> {
    case uninitialized(() -> Value)
    case initialized(Value)

    init(wrappedValue: @autoclosure @escaping () -> Value) {
        self = .uninitialized(wrappedValue)
    }

    var wrappedValue: Value {
        mutating get {
            switch self {
            case .uninitialized(let initializer):
                let value = initializer()
                self = .initialized(value)
                return value
            case .initialized(let value):
                return value
            }
        }
        set {
            self = .initialized(newValue)
        }
    }
}

它是线程安全的实现吗?如果不是,如何重现非线程安全的行为?

【问题讨论】:

    标签: swift generics lazy-evaluation lazy-initialization property-wrapper


    【解决方案1】:

    我有同样的问题,所以我通过编写一个小测试来测试它,该测试在类中的属性上使用此属性包装器,然后尝试打印出值(自纪元以来的时间)异步(10000 次)和它在 WrappedValue 的 getter 内的“返回值”行上出现 SIGABRT。

    我也尝试在不打印的情况下“获取”值,但我遇到了同样的问题。

    所以我不得不说:不,它不是线程安全的。

    编辑:我想补充一点,我在https://www.onswiftwings.com/posts/atomic-property-wrapper/ 上做了同样的测试,而且确实是线程安全的,所以你可以以此为基础来制作你自己的线程安全的“懒惰”。

    【讨论】:

      猜你喜欢
      • 2015-06-27
      • 1970-01-01
      • 1970-01-01
      • 2016-05-22
      • 2013-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多