一.CPU與線程運行方式
CPU主要工作就是向內存要一條指令黍聂, 執(zhí)行這個指令浦旱, 如果是個跳轉指令的話张症,我就問內存要跳轉的目標地址的那一條指令检疫。當然為了提高效率讶请,根據(jù) 時間局部性和空間局部性原理,將部分程序緩存在cpu屎媳,每次讀寫指令和數(shù)據(jù)夺溢, 都問cpu緩存要, 緩存沒有從內存加載烛谊。
-
程序從硬盤加載到內存是根據(jù)段表與頁表存儲的风响,不同的程序分配不同的段(一塊內存空間),一個程序分配一個進程。
上下文切換:正在進行的程序隨時可以被打斷(CPU搶占機制)丹禀,退出當前進程時状勤,CPU保存當前進程調度狀態(tài), 回到內存里歇著去双泪,下一次運行時恢復持搜。
線程:把一個進程當成一個資源的容器, 讓里邊運行幾個輕量級的進程焙矛, 就叫線程吧葫盼, 這些線程共享進程的所有資源, 例如地址空間村斟,全局變量贫导,文件資源等等抛猫。
參考:碼農翻身
二.java內存模型
- Java內存模型(Java Memory Model,JMM) 是對Java并發(fā)編程中線程與內存的關系的定義脱盲,即線程間的共享變量存儲在主內存(Main Memory) 中邑滨,每個線程都有一個私有的本地工作內存(Local Memory)(對CPU寄存器和高速緩存的抽象)
- 一致性的問題。目前處理一致性問題主要有共享內存和消息通信這兩個大的方式钱反,每種方式里面又根據(jù)不同的需求有不同的實現(xiàn)方式掖看。Java內存模型處理的就是單機器多CPU場景下的內存一致性問題。如果程序是正確同步的面哥,程序的執(zhí)行將具有順序一致性(sequentially consistent)–即程序的執(zhí)行結果與該程序在順序一致性內存模型中的執(zhí)行結果相同哎壳。這里的同步是指廣義上的同步,包括對常用同步原語(lock尚卫,volatile和final)的正確使用归榕。在JMM中,如果一個操作執(zhí)行的結果需要對另一個操作可見吱涉,那么這兩個操作之間必須要存在happens-before關系刹泄。
- 內存可見性(數(shù)據(jù)同步):Java提供了volatile關鍵字來保證可見性。當一個共享變量被volatile修飾時怎爵,它會保證線程工作內存中修改的值會立即被更新到主內存中特石,其他線程也會將主內存中的新值同步至工作內存,需要注意的是volatile并不能保證原子性鳖链。
- 加鎖就是就是取消進程的某一線程的行動權
參考:
1.聊聊高并發(fā)(三十四)Java內存模型那些事(二)理解CPU高速緩存的工作原理
2.查看《淺析Java并發(fā)編程》系列文章目錄
3.深入理解java內存模型系列文章