java - Mengapa kaedah get() dalam ConcurrentHashMap tidak boleh dikunci?
漂亮男人
漂亮男人 2017-05-17 10:00:31
0
1
864
 public V get(Object key) {
        Segment<K,V> s; // manually integrate access methods to reduce overhead
        HashEntry<K,V>[] tab;
        int h = hash(key);
        long u = (((h >>> segmentShift) & segmentMask) << SSHIFT) + SBASE;
        if ((s = (Segment<K,V>)UNSAFE.getObjectVolatile(segments, u)) != null &&
            (tab = s.table) != null) {
            for (HashEntry<K,V> e = (HashEntry<K,V>) UNSAFE.getObjectVolatile
                     (tab, ((long)(((tab.length - 1) & h)) << TSHIFT) + TBASE);
                 e != null; e = e.next) {
                K k;
                if ((k = e.key) == key || (e.hash == h && key.equals(k)))
                    return e.value;
            }
        }
        return null;
    }

Mengapa Vector's get memerlukan penguncian yang disegerakkan tetapi ConcurrentHashMap tidak? Selain itu, CopyOnWriteArrayList juga menggunakan copy-on-write untuk mencapai bacaan dan penulisan selari. Jelas sekali, ConcrrentHashMap tidak melaksanakan copy-on-write. Bagaimanakah ia memastikan keadaan perantaraan yang tidak konsisten tidak akan dibaca semasa membaca dan menulis selari.

漂亮男人
漂亮男人

membalas semua(1)
PHPzhong

Artikel ini menerangkannya dengan sangat baik

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan