我经常遇到关键术语“线程安全”,并想知道这意味着什么。例如,在Firebase或Realm中,某些对象被视为“线程安全”。什么对线程安全有什么意义?
答案 0 :(得分:4)
如果多个线程可以调用方法或访问对象的成员数据而没有任何问题,则称对象是线程安全的;一个“问题”被广义地定义为仅从一个线程访问时的行为背离。
例如,包含常规整数i = i + 1
的代码i
的对象不是线程安全的,因为两个线程可能会遇到该语句而一个线程可能会读取i
的原始值,递增它,然后写回该单个递增的值;所有与另一个线程同时出现。这样,i
只会增加一次,应该增加两次。
答案 1 :(得分:3)
线程不安全 - >如果任何对象允许同时修改多个线程。 线程安全 - >如果任何对象不允许同时修改多个线程。可变对象通常是线程安全的
答案 2 :(得分:1)
在搜索答案后,我从this网站获得了以下内容:
可以从多个线程或并发任务安全地调用线程安全代码,而不会导致任何问题(数据损坏,崩溃等)。非线程安全的代码一次只能在一个上下文中运行。线程安全代码的一个例子是让a = [“线程安全”]。此数组是只读的,您可以同时从多个线程使用它而不会出现问题。另一方面,使用var a = [“thread-unsafe”]声明的数组是可变的并且可以修改。这意味着它不是线程安全的,因为几个线程可以同时访问和修改数组,结果不可预测。变量和数据结构是可变的,而不是固有的线程安全的,一次只能从一个线程访问。
答案 3 :(得分:0)
Thread safe
意味着您的程序可以按预期工作。这与多线程环境有关,shared resource
存在问题。依次创建:Atomicity, Visibility, Ordering
[About]
Apple通过Synchronization Tools
为我们提供了
Atomicity
Atomic Operations
-基于硬件指令的无锁机制,例如Compare-And-Swap(CAS) Visibility
Volatile Variable
-从内存中读取值(无缓存) Ordering
Memory Barriers
-保证最新数据[About] 其他
Locks
Mutex
是Semaphore
的一种,其中线程可以获取,并且可以作为单个入侵者使用块,其他所有线程将被阻塞,直到发布 答案 4 :(得分:0)
举个简单的例子。如果某些内容在多个线程之间共享而没有任何崩溃等问题,则它是线程安全的。例如,如果您有一个常量 (let value = ["Facebook"]) 并且它在多个线程之间共享,则它是线程安全的,因为它是只读的且无法修改。而如果你有一个变量(var value = ["Facebook"]),当与多个线程共享时,它可能会导致潜在的崩溃或数据丢失,因为它的数据是可以修改的。