atomic是絕對的線程安全么?為什么?如果不是,那應該如何實現?


atomic不是絕對的線程安全。atomic的本意是指屬性的存取方法是線程安全的,並不保證整個對象是線程安全的

    @property (atomic, assign) int intA;

    

    //線程A

    for (int i = 0; i < 10000; i ++)

    {

        self.intA = self.intA + 1;

        NSLog(@"Thread A: %d\n", self.intA);

    }

    

    //線程B

    for (int i = 0; i < 10000; i ++)

    {

        self.intA = self.intA + 1;

        NSLog(@"Thread B: %d\n", self.intA);

    }

 

self.intA 是原子操作,但是self.intA = self.intA + 1這個表達式並不是原子操作。
所以線程是不安全的。
threadA 在執行表達式 self.intA之后 self.intA = self.intA + 1;並沒有執行完畢
此時threadB 執行self.intA = self.intA + 1;
再回到threadA時,self.intA的數值就被更新了;所以僅僅使用atomic並不能保證線程安全。

需要用互斥鎖來保證線程安全性。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM