java源程序先經(jīng)過javac編譯器編譯成二進(jìn)制的.class字節(jié)碼文件(跨平臺(tái)指的是.class字節(jié)碼文件的跨平臺(tái)想邦,.class字節(jié)碼文件是與平臺(tái)無關(guān)的)译断,class文件運(yùn)行在jvm上非剃,java解釋器(jvm的一部分)會(huì)將其解釋成對(duì)應(yīng)平臺(tái)的機(jī)器碼執(zhí)行瞻颂。不同平臺(tái)上的jvm不同霜威,而在不同平臺(tái)上生成的class文件都是一樣的泣栈,而class文件再由對(duì)應(yīng)平臺(tái)的jvm解釋成對(duì)應(yīng)平臺(tái)的機(jī)器碼執(zhí)行眨猎。
JRE顧名思義是java運(yùn)行時(shí)環(huán)境遥缕,包含了java虛擬機(jī),java基礎(chǔ)類庫宵呛。是使用java語言編寫的程序運(yùn)行所需要的軟件環(huán)境单匣,是提供給想運(yùn)行java程序的用戶使用的。
JDK顧名思義是java開發(fā)工具包,是程序員使用java語言編寫java程序所需的開發(fā)工具包户秤,是提供給程序員使用的码秉。JDK包含了JRE,同時(shí)還包含了編譯java源碼的編譯器javac鸡号,還包含了很多java程序調(diào)試和分析的工具:jconsole转砖,jvisualvm等工具軟件,還包含了java程序編寫所需的文檔和demo例子程序鲸伴。
如果你需要運(yùn)行java程序府蔗,只需安裝JRE就可以了。如果你需要編寫java程序汞窗,需要安裝JDK姓赤。
HashMap最多只允許一條記錄的鍵為null,允許多條記錄的值為null仲吏,HashMap非線程安全不铆,即任一時(shí)刻可以有多個(gè)線程同時(shí)寫HashMap,可能會(huì)導(dǎo)致數(shù)據(jù)不一致裹唆。
在hashmap?做put?操作的時(shí)候誓斥,假如A線程和B線程同時(shí)對(duì)同一個(gè)數(shù)組位置調(diào)用addEntry,兩個(gè)線程會(huì)同時(shí)得到現(xiàn)在的頭結(jié)點(diǎn)许帐,然后A寫入新的頭結(jié)點(diǎn)之后劳坑,B也寫入新的頭結(jié)點(diǎn),那B的寫入操作就會(huì)覆蓋A的寫入操作造成A的寫入操作丟失成畦。同理泡垃,當(dāng)多線程對(duì)同一數(shù)組位置進(jìn)行remove操作時(shí)也會(huì)產(chǎn)生覆蓋。
CHM適用于讀者數(shù)量超過寫者時(shí)羡鸥,當(dāng)寫者數(shù)量大于等于讀者時(shí)蔑穴,CHM的性能是低于Hashtable和synchronized Map的。這是因?yàn)楫?dāng)鎖住了整個(gè)Map時(shí)惧浴,讀操作要等待對(duì)同一部分執(zhí)行寫操作的線程結(jié)束存和。CHM適用于做cache,在程序啟動(dòng)時(shí)初始化,之后可以被多個(gè)請(qǐng)求線程訪問衷旅。正如Javadoc說明的那樣捐腿,CHM是HashTable一個(gè)很好的替代,但要記住柿顶,CHM的比HashTable的同步性稍弱茄袖。
總結(jié):
? CHM允許并發(fā)的讀和線程安全的更新操作
? 在執(zhí)行寫操作時(shí),CHM只鎖住部分的Map
? 并發(fā)的更新是通過內(nèi)部根據(jù)并發(fā)級(jí)別將Map分割成小部分實(shí)現(xiàn)的
? 高的并發(fā)級(jí)別會(huì)造成時(shí)間和空間的浪費(fèi)嘁锯,低的并發(fā)級(jí)別在寫線程多時(shí)會(huì)引起線程間的競爭
? CHM的所有操作都是線程安全
? CHM返回的迭代器是弱一致性宪祥,fail-safe并且不會(huì)拋出ConcurrentModificationException異常
? CHM不允許null的鍵值
? 可以使用CHM代替HashTable聂薪,但要記住CHM不會(huì)鎖住整個(gè)Map