2017-04-12 84 views
0

我已經閱讀了很多次,我應該避免共享狀態以避免異步編程或多線程競爭條件。如何避免共享狀態?

因此,舉例來說,如果我有一個程序,它從外部服務器保持獲取數據和更新的對象在內存和用戶的請求,請發送對象從內存。

我將如何改變這樣的程序不使用共享狀態的行爲?

我想不出任何有意義的方法。我誤解了不使用共享狀態的想法嗎?

回答

1

共享狀態/競態條件是更多的什麼信息,你不想失去的關注。

使用您的例子,它可能是合理的用戶更新自己的登錄設置,併爲您從內存發送的用戶對象的一個​​更新版本的數據庫。這是合理的,因爲用戶無法同時從兩臺計算機更新自己的登錄設置。

在另一方面,如果你有一個計數器來計算網站的訪問總人數的對象,這將是不可取的發送內存對象被寫入到數據庫。這將是「共享狀態」,因此許多用戶需要同時寫入該變量,這肯定會過期。例如,我可能是該網站的第五個訪問者,但由於我的互聯網速度很慢,您在訪問網站的同時將5寫入數據庫。當我開始查看頁面時,我只查詢數據庫,因此在計數器中有一個4的對象,因此我在後面寫入5到數據庫,這有效地使您訪問該網站失效。相反,你會想要在服務器端進行現場訪問,並且只需添加+1就可以獲得(並且將其包含在線程安全的同步代碼中)。

+0

但是,如果我想更新使用現有的信息從該對象的對象,我會得到該對象的最新副本,或鎖定該對象的任何變化,對不對? – sidoshi

+0

不一定。如果它像用戶的元數據一樣,你可能不在乎你是否覆蓋整個事物。 – Julie