如何在多線程環境中訪問全局變量?例如:下面的messageServerUrl變量如何保持線程安全?它足夠原子以保持安全嗎?如果沒有,還有其他解決方案嗎?任何想法請分享,在此先感謝。如何在多線程環境中訪問全局變量?
@property(atomic,copy)NSString * messageServerUrl;
如何在多線程環境中訪問全局變量?例如:下面的messageServerUrl變量如何保持線程安全?它足夠原子以保持安全嗎?如果沒有,還有其他解決方案嗎?任何想法請分享,在此先感謝。如何在多線程環境中訪問全局變量?
@property(atomic,copy)NSString * messageServerUrl;
atomic
不會奇蹟般地保持線程安全。它只是一個線程安全的訪問器方法。
非常非常非常小心的是什麼使共享價值安全(有時甚至不是這樣!)。如果你從兩個不同的線程中獲得同樣的價值,那麼你的生活仍然會受到嚴重的干擾,從而使你的邏輯處於風險之中。
例如,如果您知道此值是在輔助線程啓動之前設置的,並且您之後所做的所有操作都是使用getter,那麼是的,這可能是安全的。
但多線程之間共享數據的最安全的方法是:不要。如果數據不需要更改,那麼一開始就將它傳遞給輔助線程。這就是爲什麼GCD非常精彩:默認情況下它是串行隊列,加上你將數據傳遞給下一個線程執行的塊,所以你可以在沒有鎖的情況下實現有效的鎖定(這很容易導致錯誤管理)。
順便說一句 - 'messageServerUrl'不是全局變量。這是一個財產。每個類的實例都有自己的屬性副本。 – rmaddy
@rmaddy呃,這個實例中的所有方法都是全局的,無論它們在哪個線程上運行。事實上,從更深層次上講,變量甚至不是財產;它是一個實例變量。 「屬性」只意味着該實例變量有一個訪問方法。 – matt
@matt屬性不需要實例變量。當然在大多數情況下有一個,但並非總是如此。而術語「全局變量」通常具有與實例變量或屬性不同的含義。 – rmaddy