我已經閱讀了很多次,我應該避免共享狀態以避免異步編程或多線程競爭條件。如何避免共享狀態?
因此,舉例來說,如果我有一個程序,它從外部服務器保持獲取數據和更新的對象在內存和用戶的請求,請發送對象從內存。
我將如何改變這樣的程序不使用共享狀態的行爲?
我想不出任何有意義的方法。我誤解了不使用共享狀態的想法嗎?
我已經閱讀了很多次,我應該避免共享狀態以避免異步編程或多線程競爭條件。如何避免共享狀態?
因此,舉例來說,如果我有一個程序,它從外部服務器保持獲取數據和更新的對象在內存和用戶的請求,請發送對象從內存。
我將如何改變這樣的程序不使用共享狀態的行爲?
我想不出任何有意義的方法。我誤解了不使用共享狀態的想法嗎?
共享狀態/競態條件是更多的什麼信息,你不想失去的關注。
使用您的例子,它可能是合理的用戶更新自己的登錄設置,併爲您從內存發送的用戶對象的一個更新版本的數據庫。這是合理的,因爲用戶無法同時從兩臺計算機更新自己的登錄設置。
在另一方面,如果你有一個計數器來計算網站的訪問總人數的對象,這將是不可取的發送內存對象被寫入到數據庫。這將是「共享狀態」,因此許多用戶需要同時寫入該變量,這肯定會過期。例如,我可能是該網站的第五個訪問者,但由於我的互聯網速度很慢,您在訪問網站的同時將5
寫入數據庫。當我開始查看頁面時,我只查詢數據庫,因此在計數器中有一個4
的對象,因此我在後面寫入5
到數據庫,這有效地使您訪問該網站失效。相反,你會想要在服務器端進行現場訪問,並且只需添加+1就可以獲得(並且將其包含在線程安全的同步代碼中)。
但是,如果我想更新使用現有的信息從該對象的對象,我會得到該對象的最新副本,或鎖定該對象的任何變化,對不對? – sidoshi
不一定。如果它像用戶的元數據一樣,你可能不在乎你是否覆蓋整個事物。 – Julie