Pelaksanaan dalaman menggunakan kunci, jadi anda tidak perlu menambah lapisan kunci lain apabila anda menggunakannya
『他都是复制出一个新的数组进行复制, 而非在原地操作』 你在哪里看到有复制的代码?
2/3 Jika anda membaca apabila penulisan tidak selesai, anda akan membaca nol Pada masa ini, kunci dikunci oleh operasi menulis, dan kemudian baca semula.
get Tidak perlu kunci, hanya membaca tidak akan mengubah data
readValueUnderLock Syarat biasa tidak akan dilaksanakan
e.value tidak akan digunakan untuk null Pengarang Doug Lea menerangkan seperti berikut
Not quite. You are right that it should never be called. However, the JLS/JMM can be read as not absolutely forbidding it from being called because of weaknesses in required ordering relationships among finals vs volatiles set in constructors (key is final, value is volatile), wrt the reads by threads using the entry objects. (In JMM-ese, ordering constraints for finals fall outside of the synchronizes-with relation.) That's the issue the doc comment (pasted below) refers to. No one has ever thought of any practical loophole that a processor/compiler might find to produce a null value read, and it may be provable that none exist (and perhaps someday a JLS/JMM revision will fill in gaps to clarify this), but Bill Pugh once suggested we put this in anyway just for the sake of being conservatively pedantically correct. In retrospect, I'm not so sure this was a good idea, since it leads people to come up with exotic theories.
Dalam versi jdk yang lebih tinggi, ConncurrentHashMap telah ditulis semula sepenuhnya dan bahagian kod ini hilang.
Operasi Dapatkan tidak mengubah tatasusunan asas atau senarai terpaut. Soalan poster asal mungkin bahawa utas lain diletakkan pada masa yang sama semasa Dapatkan, atau utas lain dialih keluar pada masa yang sama semasa Dapatkan. Sebenarnya, tiada masalah di sini Jika get di hadapan dan letakkan di belakang, maka anda akan mendapat null. Tidak akan ada situasi di mana anda mendapat null jika anda meletakkannya dahulu, atau mendapat obj jika anda mengalih keluarnya dahulu. Oleh kerana operasi akhir keluarkan atau letak ialah segmen tetapan atom[i].jadual[j].
Pelaksanaan dalaman menggunakan kunci, jadi anda tidak perlu menambah lapisan kunci lain apabila anda menggunakannya
2/3 Jika anda membaca apabila penulisan tidak selesai, anda akan membaca nol Pada masa ini, kunci dikunci oleh operasi menulis, dan kemudian baca semula.
get
Tidak perlu kunci, hanya membaca tidak akan mengubah datareadValueUnderLock
Syarat biasa tidak akan dilaksanakane.value
tidak akan digunakan untuknull
PengarangDoug Lea
menerangkan seperti berikutDalam versi jdk yang lebih tinggi,
ConncurrentHashMap
telah ditulis semula sepenuhnya dan bahagian kod ini hilang.ConncurrentHashMap diperkenalkan oleh jdk5 Operasinya sendiri memastikan keselamatan benang, jadi tidak perlu menguncinya
Model membaca dan menulis klasik, umumnya tiada penguncian diperlukan untuk membaca
Operasi Dapatkan tidak mengubah tatasusunan asas atau senarai terpaut. Soalan poster asal mungkin bahawa utas lain diletakkan pada masa yang sama semasa Dapatkan, atau utas lain dialih keluar pada masa yang sama semasa Dapatkan. Sebenarnya, tiada masalah di sini Jika get di hadapan dan letakkan di belakang, maka anda akan mendapat null. Tidak akan ada situasi di mana anda mendapat null jika anda meletakkannya dahulu, atau mendapat obj jika anda mengalih keluarnya dahulu. Oleh kerana operasi akhir keluarkan atau letak ialah segmen tetapan atom[i].jadual[j].