深入理解JVM-java內(nèi)存模型與線程
java內(nèi)存模型
主內(nèi)存
工作內(nèi)存
內(nèi)存間交互操作
關于主內(nèi)存和工作內(nèi)存之間具體的交互協(xié)議裹驰。即一個變量如何從祝內(nèi)存拷貝到工作內(nèi)存,如何從工作內(nèi)存同步到祝內(nèi)存之類的實現(xiàn)細節(jié)质欲。java內(nèi)存模型中定義了以下8中操作來完成免绿,虛擬機實現(xiàn)時必須保證下面提到的每一種操作都是原子的,不可分割的钾军。
- lock 作用于主內(nèi)存
- unlock 作用于主內(nèi)存
- read 作用于主內(nèi)存
- load 作用于工作內(nèi)存
- use 作用于工作內(nèi)存:他把工作內(nèi)存中的一個變量的值傳遞給執(zhí)行引擎
- assign 作用于工作內(nèi)存 他把一個從執(zhí)行引擎接收到的值賦值給工作內(nèi)存的變量,每當虛擬機遇到一個給變量賦值的字節(jié)碼執(zhí)行時執(zhí)行這個操作绢要。
- store 作用于工作內(nèi)存 他把工作內(nèi)存中一個變量的值傳遞到主內(nèi)存中吏恭。
- write 作用于主內(nèi)存的變量,他把store操作從工作內(nèi)存中獲得的變量的值放入主內(nèi)存的變量中重罪,
volatile語義
原子性/可見性/有序性
先行發(fā)生原則
先行發(fā)生時java內(nèi)存模型中定義的兩項操作之間的偏序關系樱哼,如果說操作a先行發(fā)生于操作比,其實就是說在發(fā)生操作b之前剿配,操作a產(chǎn)生的影響能被操作b觀察到搅幅,影響包括修改了內(nèi)存中共享變量的值,發(fā)送了消息呼胚,調(diào)用了方法等茄唐。
java與線程
實現(xiàn)線程的三種方式
使用內(nèi)核線程實現(xiàn)
使用內(nèi)核線程實現(xiàn)
使用用戶線程加精良機進程混合實現(xiàn)
線程調(diào)度
線程調(diào)度是指系統(tǒng)為線程分配處理器使用權的過程。主要調(diào)度方式有兩種蝇更,協(xié)同式線程調(diào)度和搶占式線程調(diào)度沪编。
狀態(tài)轉(zhuǎn)換
線程安全:當多個線程訪問一個對象時,如果不用考慮這些線程在運行時環(huán)境更下的調(diào)度和交替執(zhí)行年扩,也不用進行額外的同步蚁廓,或者在戴永芳進行任何其他的協(xié)同操作,調(diào)用這個對象的行為都可以獲得正確的結果常遂,那這個對象時線程安全的纳令。
按照線程安全的安全程度,我們將java語言中各種操作共享的數(shù)據(jù)分為 以下5類:
不可變克胳;絕對線程安全平绩;相對線程安全;線程兼容漠另;線程對立
鎖優(yōu)化:
- 自旋鎖和自適應自旋
- 鎖消除
- 鎖粗化
- 輕量級鎖
- 偏向鎖