一、Java內(nèi)存模型
? ? Java內(nèi)存模型來屏蔽掉各種硬件和操作系統(tǒng)的內(nèi)存訪問差異深浮,以實(shí)現(xiàn)讓Java程序在各種平臺(tái)下都能達(dá)到一致的內(nèi)存訪問效果压怠。
? ?Java內(nèi)存規(guī)定了所有的變量(Java實(shí)例變量,靜態(tài)變量飞苇,字段等)都存在主內(nèi)存中菌瘫,每條線程都有自己的工作內(nèi)存,線程的工作內(nèi)存保存了被該線程使用到的變量的主內(nèi)存副本拷貝玄柠,線程對(duì)變量的所有操作都必須在工作內(nèi)存中進(jìn)行突梦,然后再拷貝到主內(nèi)存,不同的線程之間不能直接訪問對(duì)方的工作內(nèi)存中變量羽利。
?1宫患、內(nèi)存交互
? ?內(nèi)存交互需要經(jīng)過
read:主內(nèi)存變量傳輸?shù)焦ぷ鲀?nèi)存
load ?:把主內(nèi)存中得到的變量方法工作內(nèi)存的變量副本中。
use:把工作內(nèi)存中的變量傳遞給執(zhí)行引擎这弧。
assign:從執(zhí)行引擎接收到的變量賦值給工作內(nèi)存中的變量
store:把變量值傳遞到主內(nèi)存娃闲。
write:把工作內(nèi)存的變量放到主內(nèi)存的變量中。
所有指令都是原子性的匾浪。
?對(duì)于double,long類型的皇帮,可以不保證load store read 和write這四個(gè)操作的原子性。
2蛋辈、属拾、Volatile
?Volatie的特點(diǎn):1、對(duì)所有線程的可見性冷溶;2渐白、靜止指令重排序優(yōu)化 (加入內(nèi)存屏障)
? ?但不能保證并發(fā)線程中,對(duì)值的操作是安全的逞频。
3纯衍、可見性,原子性苗胀、有序性
? 1襟诸、原子性:基本指令 load瓦堵、read、use歌亲、assign菇用、store、write应结。
? 2刨疼、可見性:volatile,synchronized、final
?3鹅龄、有序性:volatile,sysnchronized
二、線程
?線程:分為內(nèi)核線程亭畜、用戶線程扮休、用戶線程加輕量級(jí)進(jìn)程。
?1拴鸵、線程調(diào)度:指系統(tǒng)為線程分配處理器使用權(quán)的過程玷坠。主要調(diào)度分為:協(xié)同式線程調(diào)度和搶占式線程調(diào)度。
協(xié)同式線程調(diào)度:執(zhí)行時(shí)間由自己控制劲藐,執(zhí)行完成后八堡,通知系統(tǒng)執(zhí)行另外一個(gè)線程。
搶占式線程調(diào)度:執(zhí)行時(shí)間由操作系統(tǒng)來分配聘芜。
2兄渺、線程的狀態(tài)
? ?1、創(chuàng)建:創(chuàng)建未啟動(dòng)
? ?2汰现、runnable:運(yùn)行狀態(tài)
? ?3挂谍、等待狀態(tài):wait方法。
? ?4瞎饲、Blocking:阻塞狀態(tài)口叙。
? ?5、死亡狀態(tài):線程銷毀了嗅战。