日記
久々に湯船浸かるかーと思ったら排水口にお湯を捨てていた.仕方がないのでシャワーだけ浴びてビール飲みながら書いてる.
今日書いたコード
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