「線程安全」以上或之外 - 沒有止境的道路

線程安全究竟是什麼意思? 安全

如今的線程安全,流行的說法應該指的是保證類在多線程環境下的語義保持性。即:即便在多線程環境下,類的原始語義仍然獲得保留。即,類不會在多線程環境下表現出跟單線程環境下同樣的結果。 多線程

其實就是丟掉線程,類必須是安全的。類必須維持它的語義。爲了達到這個語義,在多線程狀況下須要做一些特殊處理,可是這種處理,能作的也僅僅如此:即保證類操做的語義。 線程

所以,線程安全不是指你這麼處理了,而後對象就安全了。不是這樣的。是指相對於線程,它安全了。或者說,多線程自己並不足以擾亂它的步伐,或者它在多線程環境下仍然表現良好(表現出正確的語義提供能力)。 對象

所以線程安全是一個相對於線程的概念,而不是安全的概念。它是一種相對安全,不是絕對安全。 內存

好比,無論你怎麼作同步,鎖,到最後的數據安全仍然決定於最終的處理環境。 同步

假設有十個調用層次,AND你在最終的層次也就是最頂層做了同步。但除非你的代碼不向外發布,不然仍是沒有辦法保證數據的安全。由於你不能保證你的調用者的行爲。你的調用者,他可能這麼幹,作一下操做A,歇一下,而後作一下操做B,而後C,,依此類推。反正這樣的調用不會在瞬間完成,因此你仍是沒有辦法保證同步。 線程安全

換句話說,同步就是個無止境的事情。線程安全解決不了它。即便你的類都只有一個操做,也仍是解決不了這個問題。只要還存在組合狀態或者說操做,數據安全的問題就不可能獲得解決。這個一方面是順序式結構自己的問題,另外一方面則是一個同步問題。 數據

有時候,換句話說,甚至你沒有線程,也即只有一個線程,仍然不能保證外部有幾個線程。你的調用者有幾個線程。好比你就一個線程,UI線程,可是有多個用戶。這幾個用戶,他們自己就是「線程」。無論JAVA內部的數據同步機制如何,人腦可不是JAVA能處理的東西是吧。 共享內存

再換句話說:即便線程「安全」了又如何是吧。安全的範圍仍然只在「線程」。也就是說,線程被保證了拿到正確的數據,可是WHAT ABOUT OTHER PLAYERS, RIGHT?好比,人?好比客戶機,好比別的什麼不在本地共享內存塊中的東西。

是吧!

相關文章
相關標籤/搜索