Saya baca JDK's source code tentang ConcurrentHashMap.
Tapi kode berikut saya bingung:
public boolean isEmpty() {
final Segment<K,V>[] segments = this.segments;
...
}
Pertanyaan saya adalah:
"ini.segmen" ini menyatakan:
final Segment<K,V>[] segments;
Jadi, di sini, di awal metode, menyatakan jenis yang sama referensi, menunjuk ke memori yang sama.
Mengapa penulis menulis seperti ini? Kenapa't mereka gunakan ini.segmen ini diatas? Ada beberapa alasan?
Ini adalah sebuah idiom khas untuk kunci-kode gratis yang melibatkan volatile
variabel. Pada baris pertama, anda membaca volatile
sekali dan kemudian bekerja dengan itu. Sementara itu thread lain dapat memperbarui volatile
, tapi anda hanya tertarik pada nilai awalnya anda baca.
Juga, bahkan ketika anggota variabel dalam pertanyaan ini tidak mudah menguap tapi akhir, ungkapan ini harus dilakukan dengan CPU cache seperti membaca dari tumpukan lokasi cache lebih ramah daripada membaca dari acak tumpukan lokasi. Ada juga kesempatan yang lebih tinggi yang lokal var akan berakhir terikat ke CPU register.
Untuk kasus yang terakhir ini sebenarnya ada beberapa kontroversi, sejak JIT compiler biasanya akan mengurus kekhawatiran mereka, tapi Doug Lea adalah salah satu dari orang-orang yang tongkat dengan itu pada prinsip umum.
Saya kira itu's untuk kinerja pertimbangan, sehingga kita hanya perlu mengambil nilai field sekali.
Anda dapat merujuk ke singleton idiom dari efektif jawa oleh Joshua Bloch
Nya singleton adalah berikut ini:
private volatile FieldType field;
FieldType getField() {
FieldType result = field;
if (result == null) {
synchronized(this) {
result = field;
if (result == null)
field = result = computeFieldValue();
}
}
return result;
}
dan dia menulis:
kode Ini mungkin tampak sedikit berbelit-belit. Secara khusus, kebutuhan untuk variabel lokal hasil yang mungkin tidak jelas. Apa variabel ini adalah untuk memastikan bahwa bidang dibaca hanya sekali dalam kasus umum di mana itu sudah diinisialisasi. Sementara tidak benar-benar diperlukan, hal ini dapat meningkatkan kinerja dan lebih elegan dengan standar yang diterapkan untuk tingkat rendah bersamaan pemrograman. Pada mesin saya, metode di atas adalah sekitar 25 persen lebih cepat daripada yang jelas versi tanpa variabel lokal.
Hal ini dapat mengurangi kode byte size - mengakses variabel lokal yang lebih pendek dalam kode byte dari pengaksesan suatu instance variabel.
Runtime optimasi biaya overhead dapat dikurangi juga.
Tapi tak satu pun dari ini adalah signifikan. It's lebih lanjut tentang kode style. Jika anda merasa nyaman dengan instance variable, dengan segala cara. Doug Lea mungkin ** merasa lebih nyaman berurusan dengan variabel lokal.