cari

Rumah  >  Soal Jawab  >  teks badan

java - ConcurrentHashMap的get为什么可以不加锁?

ringa_leeringa_lee2802 hari yang lalu827

membalas semua(5)saya akan balas

  • 阿神

    阿神2017-04-18 10:08:21

    1. 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.

    balas
    0
  • 阿神

    阿神2017-04-18 10:08:21

    1. get Tidak perlu kunci, hanya membaca tidak akan mengubah data

    2. readValueUnderLock Syarat biasa tidak akan dilaksanakan

    3. 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.

    balas
    0
  • 黄舟

    黄舟2017-04-18 10:08:21

    ConncurrentHashMap diperkenalkan oleh jdk5 Operasinya sendiri memastikan keselamatan benang, jadi tidak perlu menguncinya

    balas
    0
  • 天蓬老师

    天蓬老师2017-04-18 10:08:21

    Model membaca dan menulis klasik, umumnya tiada penguncian diperlukan untuk membaca

    balas
    0
  • PHPz

    PHPz2017-04-18 10:08:21

    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].

    balas
    0
  • Batalbalas