并發(fā)程序正確地執(zhí)行担映,必須要保證原子性拧粪、可見性以及有序性。只要有一個沒有被保證邀桑,就有可能會導(dǎo)致程序運行不正確。
原子性:表示這個線程是不可分割的.中間沒辦法被其他線程打斷
可見性:表示這個線程執(zhí)行之后的結(jié)果能馬上被其他線程知道
有序性:表示這個線程的執(zhí)行是有順序的
volatile關(guān)鍵字來保證可見性科乎。
volatile關(guān)鍵字保證了操作的可見性壁畸,但是volatile不能保證對變量的操作是原子性
volatile能在一定程度上保證有序性
觀察加入volatile關(guān)鍵字和沒有加入volatile關(guān)鍵字時所生成的匯編代碼發(fā)現(xiàn),加入volatile關(guān)鍵字時茅茂,會多出一個lock前綴指令”
lock前綴指令實際上相當(dāng)于一個內(nèi)存屏障(也成內(nèi)存柵欄)捏萍,內(nèi)存屏障會提供3個功能:
1)它確保指令重排序時不會把其后面的指令排到內(nèi)存屏障之前的位置,也不會把前面的指令排到內(nèi)存屏障的后面空闲;即在執(zhí)行到內(nèi)存屏障這句指令時令杈,在它前面的操作已經(jīng)全部完成;
2)它會強制將對緩存的修改操作立即寫入主存碴倾;
3)如果是寫操作逗噩,它會導(dǎo)致其他CPU中對應(yīng)的緩存行無效
1)正如我所說,HashMap和ConcurrentHashMap之前的第一個顯著區(qū)別是后來是線程安全的影斑,可以在沒有外部同步的并發(fā)環(huán)境中使用给赞。雖然它沒有提供與使用Hashtable相同的同步級別,但它足以實現(xiàn)最實用的目的矫户。
2)你可以通過將它包裝在Collections.synchornizedMap(HashMap)上來使HashMap同步,它將返回一個幾乎等同于Hashtable的集合残邀,其中Map上的每個修改操作都被鎖定在Map對象上皆辽,而在ConcurrentHashMap的情況下,線程安全是通過將整個Map劃分為基于并發(fā)級別的不同分區(qū)并且僅鎖定特定部分而不是鎖定整個Map來實現(xiàn)的芥挣。
3)ConcurrentHashMap比多線程環(huán)境中的Synchronized?HashMap更具可伸縮性和性能驱闷,而在單線程環(huán)境中,HashMap和ConcurrentHashMap都提供了相當(dāng)?shù)男阅芸彰猓渲蠬ashMap稍微好一些空另。
ConcurrentHashMap 類中包含兩個靜態(tài)內(nèi)部類 HashEntry 和 Segment。HashEntry 用來封裝映射表的鍵 / 值對蹋砚;Segment 用來充當(dāng)鎖的角色扼菠,每個 Segment 對象守護(hù)整個散列映射表的若干個桶。每個桶是由若干個 HashEntry 對象鏈接起來的鏈表坝咐。一個 ConcurrentHashMap 實例中包含由若干個 Segment 對象組成的數(shù)組循榆。
ConcurrentHashMap:https://www.ibm.com/developerworks/cn/java/java-lo-concurrenthashmap/index.html
內(nèi)置鎖的重入:等于是一個線程獲取到一個鎖的時候,可以再次獲取同一個鎖,這個叫重進(jìn)入,當(dāng)然在退出的時候也是按順序解鎖
threadLocal:相當(dāng)于一個共享的全局變量,可以把線程相對應(yīng)的數(shù)據(jù)存進(jìn)去,然后再需要的時候取出來,
如何保證對象不可變