线程安全和读写安全有什么区别?
线程安全和读写安全有什么区别?
这个问题已经在这里有答案了:
iOS中,原子属性只是保证了读写的安全性,而不是线程的安全性。有人说线程安全是更高级的概念,我对它们的区别感到困惑。有时候,读写安全是否可以用来实现线程安全?当原子属性无法保证线程安全时,为什么我们还要在多线程中使用它?
admin 更改状态以发布 2023年5月20日
原子性保证只有一个属性可以独占执行,也就是说,不能同时读取/写入对象的单个属性。
然而,原子性并不保证同一对象的两个不同属性在同时访问/写入时是互斥的。
最常用的例子是一个包含 firstName
和 lastName
属性的Person
类。
let person = Person() // Thread 1 person.firstName = "Name1" person.lastName = "LastName1" // Thread 2 person.firstName = "Name2" person.lastName = "LastName2"
最坏情况下,person
的值可能会是Name1 LastName 2
或 Name2 LastName1
。
这就是更高级别的线程安全机制的运用。我使用 lock/unlock 作为平台/语言特定的锁定机制的占位符。
let person = Person() // Thread 1 lock(person) person.firstName = "Name1" person.lastName = "LastName1" unlock(person) // Thread 2 lock(person) person.firstName = "Name2" person.lastName = "LastName2" unlock(person)
通过这种锁定/解锁,我们保证在person
上设置 firstName
和lastName
时会同时执行。