好習慣要堅持,這是我第二篇博文,任務略重,但是要堅持努力?。?!
1.競爭條件
首先,我們回顧一下《Java核心技術卷》里講到的多線程的“競爭條件”。由于各線程訪問數據的次序,可能會產生訛誤的現象,這樣一個情況通常稱為“競爭條件”。
那么,訛誤具體是怎么產生的呢?本質上,是由于操作的非原子性。比如,假定兩個線程同時執(zhí)行指令 account[to] += amount;該指令可能會被處理如下:
1)將account[to]加載到寄存器。
2)增加amount[to]。
3)將結果寫回account[to]。
現在,假定第一個線程執(zhí)行步驟1和2,然后,它被剝奪了運行權。假定第二個線程被喚醒并修改了accounts數組中的同一項。然后,第1個線程被喚醒并完成第3步。這樣,這一動作擦去了第二個線程所做的更新。于是,總金額不再正確。
---------------------------------------------我是分割線---------------------------------------------------------------------------------------------
好,我們再從java的內存模型來深層次講講“訛誤”,這里有個概念叫做“緩存一致性”。
大家都知道,計算機在執(zhí)行程序時,每條指令都是在CPU中執(zhí)行的,而執(zhí)行指令過程中,勢必涉及到數據的讀取和寫入。由于程序運行過程中的臨時數據是存放在主存(物理內存)當中的,這時就存在一個問題,由于CPU執(zhí)行速度很快,而從內存讀取數據和向內存寫入數據的過程跟CPU執(zhí)行指令的速度比起來要慢的多,因此如果任何時候對數據的操作都要通過和內存的交互來進行,會大大降低指令執(zhí)行的速度。因此在CPU里面就有了高速緩存。
也就是,當程序在運行過程中,會將運算需要的數據從主存復制一份到CPU的高速緩存當中,那么CPU進行計算時就可以直接從它的高速緩存讀取數據和向其中寫入數據,當運算結束之后,再將高速緩存中的數據刷新到主存當中。舉個簡單的例子,比如下面的這段代碼:
i = i + 1;
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動安全 [無線安全]玩轉無線電——不安全的藍牙鎖 2017-07-26
- 消息隊列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標分割】 2017-07-26
- 詞向量-LRWE模型-更好地識別反義詞同義詞 2017-07-26
- 從棧不平衡問題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實現JSON轉Model - HandyJSON使用講解 2017-07-26
- 阿里移動安全 Android端惡意鎖屏勒索應用分析 2017-07-26
- 集合結合數據結構來看看(二) 2017-07-26
![學習是年輕人改變自己的最好方式-Java培訓,做最負責任的教育,學習改變命運,軟件學習,再就業(yè),大學生如何就業(yè),幫大學生找到好工作,lphotoshop培訓,電腦培訓,電腦維修培訓,移動軟件開發(fā)培訓,網站設計培訓,網站建設培訓](http://m.roadsoft.com.cn/attached/image/templet/e87d53eb-cf7a-4689-887a-1cd260f416a5.jpg)