ぜのぜ

しりとりしようぜのぜのぜのぜ

32日目 lazy var

日記

久々に湯船浸かるかーと思ったら排水口にお湯を捨てていた.仕方がないのでシャワーだけ浴びてビール飲みながら書いてる.

今日書いたコード

class DataImporter {
    var filename = "data.txt"

    init() {
        print("Initialize DataImporter")
    }
}

class DataManager {
    lazy var importer = DataImporter()
    var data: [String] = []
}

let manager = DataManager()
print("Add Some data")
manager.data.append("Some data")
print("Add Some more data")
manager.data.append("Some more data")
print("Add Some data")
print(manager.importer.filename)

実行結果

Add Some data
Add Some more data
Add Some data
Initialize DataImporter
data.txt

初めて知ったこと

まだ初期化されていないlazyなプロパティが複数のスレッドから同時にアクセスされたとき,1度だけ初期化されることは保証されない

If a property marked with the lazy modifier is accessed by multiple threads simultaneously and the property hasn’t yet been initialized, there’s no guarantee that the property will be initialized only once. https://docs.swift.org/swift-book/LanguageGuide/Properties.html

このコードを実行すると,

import Foundation

class DataImporter {
    var filename = "data.txt"

    init() {
        print("Initialize DataImporter")
    }
}

class DataManager {
    lazy var importer = DataImporter()
    var data: [String] = []
}

let someManager = DataManager()
DispatchQueue.init(label: "first").async {
    print("first")
    someManager.importer.filename
}
DispatchQueue.init(label: "second").async {
    print("second")
    someManager.importer.filename
}

何回かに1回は以下のような出力が得られる.

second
first
Initialize DataImporter
Initialize DataImporter