国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java進(jìn)階(ConcurrentHashMap)——面試時(shí)ConcurrentHashMap常見問題解讀 & 結(jié)合源碼分析 & 多線程CAS比較并交換 初識

這篇具有很好參考價(jià)值的文章主要介紹了Java進(jìn)階(ConcurrentHashMap)——面試時(shí)ConcurrentHashMap常見問題解讀 & 結(jié)合源碼分析 & 多線程CAS比較并交換 初識。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

Java進(jìn)階(ConcurrentHashMap)——面試時(shí)ConcurrentHashMap常見問題解讀 & 結(jié)合源碼分析 & 多線程CAS比較并交換 初識,Java,java,面試,開發(fā)語言

前言

List、Set、HashMap作為Java中常用的集合,需要深入認(rèn)識其原理和特性。

本篇博客介紹常見的關(guān)于Java中線程安全的ConcurrentHashMap集合的面試問題,結(jié)合源碼分析題目背后的知識點(diǎn)。

關(guān)于List的博客文章如下:

  • Java進(jìn)階(List)——面試時(shí)List常見問題解讀 & 結(jié)合源碼分析

關(guān)于的Set的博客文章如下:

  • Java進(jìn)階(Set)——面試時(shí)Set常見問題解讀 & 結(jié)合源碼分析

關(guān)于HaseMap的博客文章如下:

  • Java進(jìn)階(HashMap)——面試時(shí)HashMap常見問題解讀 & 結(jié)合源碼分析

其他關(guān)于 數(shù)據(jù)結(jié)構(gòu) 以及 多線程 的文章如下:

  • 數(shù)據(jù)結(jié)構(gòu)與算法(Data Structures and Algorithm)——跟著Mark Allen Weiss用Java語言學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法
  • 【合集】Java進(jìn)階——Java深入學(xué)習(xí)的筆記匯總 & 再論面向?qū)ο?、?shù)據(jù)結(jié)構(gòu)和算法、JVM底層、多線程、類加載 …

Java進(jìn)階(ConcurrentHashMap)——面試時(shí)ConcurrentHashMap常見問題解讀 & 結(jié)合源碼分析 & 多線程CAS比較并交換 初識,Java,java,面試,開發(fā)語言

引出


1.從結(jié)構(gòu)上來說jdk7中,ConcurentHashMap是采用Segment段數(shù)組 + Entry數(shù)組 + 單鏈表結(jié)構(gòu);
2.從結(jié)構(gòu)上來說jdk8中,ConcurentHashMap 與 HashMap的結(jié)構(gòu)是一模一樣的;
3.ConcurrentHashMap 不支持 key 或者 value 為 null ,避免歧義;
4.JDK1.7和1.8的區(qū)別:

  1. 數(shù)據(jù)結(jié)構(gòu):取消了 Segment 分段鎖的數(shù)據(jù)結(jié)構(gòu),取而代之的是數(shù)組+鏈表+紅黑樹的結(jié)構(gòu)。
  2. 保證線程安全機(jī)制:JDK1.7 采用 Segment 的分段鎖機(jī)制實(shí)現(xiàn)線程安全,其中 Segment 繼承自 ReentrantLock 。JDK1.8 采用CAS+sizeCtl+synchronized保證線程安全。
  3. 鎖的粒度:JDK1.7 是對需要進(jìn)行數(shù)據(jù)操作的 Segment 加鎖,JDK1.8 調(diào)整為對每個(gè)數(shù)組元素加鎖(Node)。
  4. 鏈表轉(zhuǎn)化為紅黑樹:定位節(jié)點(diǎn)的 hash 算法簡化會(huì)帶來弊端,hash 沖突加劇,因此在鏈表節(jié)點(diǎn)數(shù)量到達(dá) 8(且數(shù)據(jù)總量大于等于 64)時(shí),會(huì)將鏈表轉(zhuǎn)化為紅黑樹進(jìn)行存儲。
  5. 查詢時(shí)間復(fù)雜度:從 JDK1.7的遍歷鏈表O(n), JDK1.8 變成遍歷紅黑樹O(logN)。

5.CAS是一種樂觀鎖機(jī)制,也被稱為無鎖機(jī)制文章來源地址http://www.zghlxwxcb.cn/news/detail-735860.html

核心:線程安全

ConcurentHashMap 在JDK1.7 和JDK1.8的區(qū)別?ConcurentHashMap 是怎么保證線程安全的?

  1. 從結(jié)構(gòu)上來說jdk7中,ConcurentHashMap是采用Segment段數(shù)組 + Entry數(shù)組 + 單鏈表結(jié)構(gòu)

分段,每個(gè)段里面都是hashmap,本質(zhì)還是以hashmap為單位上鎖

Java進(jìn)階(ConcurrentHashMap)——面試時(shí)ConcurrentHashMap常見問題解讀 & 結(jié)合源碼分析 & 多線程CAS比較并交換 初識,Java,java,面試,開發(fā)語言

  1. 從結(jié)構(gòu)上來說jdk8中,ConcurentHashMap 與 HashMap的結(jié)構(gòu)是一模一樣的

  2. 從線程安全來說,jdk7中,ConcurentHashMap 內(nèi)部維護(hù)的是一個(gè)Segment(段)數(shù)組,Segment數(shù)組中每個(gè)元素又是一個(gè)HashEntry數(shù)組

    Java進(jìn)階(ConcurrentHashMap)——面試時(shí)ConcurrentHashMap常見問題解讀 & 結(jié)合源碼分析 & 多線程CAS比較并交換 初識,Java,java,面試,開發(fā)語言

    Segment繼承了ReentrantLock這個(gè)類,所以segment自然就可以扮演鎖的角色,每一個(gè)segment相當(dāng)于一把鎖,這就是分段鎖

    當(dāng)其他線程在需要進(jìn)行put操作時(shí),需要先去獲取該對象的鎖資源,然而當(dāng)發(fā)現(xiàn)鎖資源被占用的時(shí)候,該線程會(huì)先去進(jìn)行節(jié)點(diǎn)的創(chuàng)建避免線程的空閑,這種思想也叫作預(yù)創(chuàng)建的思想

    因?yàn)閟egment在初始化后是不會(huì)擴(kuò)容的,HashEntry數(shù)組是會(huì)擴(kuò)容的,與HashMap機(jī)制一樣,所以HashEntry是依靠于segment鎖來維護(hù)安全,所以HashEntry的擴(kuò)容也是線程安全的

1.什么時(shí)候初始化

jdk8中,ConcurentHashMap 因?yàn)榻Y(jié)構(gòu)變?yōu)榱?數(shù)組+鏈表+紅黑樹 結(jié)構(gòu),所以維護(hù)線程安全的機(jī)制頁相對發(fā)生了一些變化,和HashMap同樣的,ConcurentHashMap 在put第一個(gè)元素時(shí),才會(huì)執(zhí)行初始化

Java進(jìn)階(ConcurrentHashMap)——面試時(shí)ConcurrentHashMap常見問題解讀 & 結(jié)合源碼分析 & 多線程CAS比較并交換 初識,Java,java,面試,開發(fā)語言

final V putVal(K key, V value, boolean onlyIfAbsent) {
     if (key == null || value == null) throw new NullPointerException();
     int hash = spread(key.hashCode()); //根據(jù)KEY計(jì)算hash值
     int binCount = 0;
     for (Node<K,V>[] tab = table;;) {
         Node<K,V> f; int n, i, fh;
         if (tab == null || (n = tab.length) == 0)
             tab = initTable(); //如果數(shù)組為null時(shí),表示第一次put,則先進(jìn)行初始化
         else if ((f = tabAt(tab, i = (n - 1) & hash)) == null) {
             if (casTabAt(tab, i, null,
                          new Node<K,V>(hash, key, value, null)))
                 break;                   // no lock when adding to empty bin
         }
         ...

2.如何保證初始化安全 sizeCtl

Java進(jìn)階(ConcurrentHashMap)——面試時(shí)ConcurrentHashMap常見問題解讀 & 結(jié)合源碼分析 & 多線程CAS比較并交換 初識,Java,java,面試,開發(fā)語言

此處核心為sizeCtl

  • sizeCtl的不同值表示不同的含義
  • sizeCtl = 0 代表數(shù)組還未初始化
  • sizeCtl > 0 如果數(shù)組已經(jīng)初始化,那么表示 擴(kuò)容閾值
  • sizeCtl = -1 表示數(shù)組正在初始化
  • sizeCtl < -1 表示數(shù)組正在擴(kuò)容,并且正在被多線程初始化中

sizeCtl 這個(gè)值,就保證了多線程并發(fā)狀態(tài)下,數(shù)組的初始化安全

Java進(jìn)階(ConcurrentHashMap)——面試時(shí)ConcurrentHashMap常見問題解讀 & 結(jié)合源碼分析 & 多線程CAS比較并交換 初識,Java,java,面試,開發(fā)語言

核心為compareAndSwapInt,比較主存中數(shù)據(jù)和當(dāng)前內(nèi)存中數(shù)據(jù)是否相同,如果不同代表有別的線程正在操作這個(gè)數(shù)據(jù)那么就返回false,退回重新爭取時(shí)間片,此處就是保證并發(fā)時(shí)線程安全的核心。

Java進(jìn)階(ConcurrentHashMap)——面試時(shí)ConcurrentHashMap常見問題解讀 & 結(jié)合源碼分析 & 多線程CAS比較并交換 初識,Java,java,面試,開發(fā)語言

private final Node<K,V>[] initTable() {
     Node<K,V>[] tab; int sc;
 //循環(huán)判斷數(shù)組是否為空/null
     while ((tab = table) == null || tab.length == 0) {
         //此處核心為sizeCtl
         /*
             sizeCtl的不同值表示不同的含義
             sizeCtl = 0 代表數(shù)組還未初始化
             sizeCtl > 0 如果數(shù)組已經(jīng)初始化,那么表示 擴(kuò)容閾值
             sizeCtl = -1 表示數(shù)組正在初始化
             sizeCtl < -1 表示數(shù)組正在擴(kuò)容,并且正在被多線程初始化中
         */
         if ((sc = sizeCtl) < 0) //此處表示數(shù)組正在被某個(gè)線程初始化
             Thread.yield(); // lost initialization race; just spin //釋放CPU時(shí)間片
         //核心為compareAndSwapInt,比較主存中數(shù)據(jù)和當(dāng)前內(nèi)存中數(shù)據(jù)是否相同,如果不同代表有別的線程正在操作這個(gè)數(shù)據(jù)那么就返回false,退回重新爭取
         //時(shí)間片
         //此處就是保證并發(fā)時(shí)線程安全的核心
         else if (U.compareAndSwapInt(this, SIZECTL, sc, -1)) { 
             try {
                 if ((tab = table) == null || tab.length == 0) {
                     int n = (sc > 0) ? sc : DEFAULT_CAPACITY; //得到了數(shù)組長度是否為自己設(shè)置還是默認(rèn)16
                     @SuppressWarnings("unchecked")
                     Node<K,V>[] nt = (Node<K,V>[])new Node<?,?>[n]; //new出數(shù)組
                     table = tab = nt;//數(shù)組賦值
                     sc = n - (n >>> 2);
                 }
             } finally {
                 sizeCtl = sc;  
             }
             break;
         }
     }
     return tab;
 }

CAS + sizeCtl 保證了初始化數(shù)據(jù)的安全

3.putval方法存入元素,加鎖

數(shù)組的初始完成后,回到putval方法存入元素

Java進(jìn)階(ConcurrentHashMap)——面試時(shí)ConcurrentHashMap常見問題解讀 & 結(jié)合源碼分析 & 多線程CAS比較并交換 初識,Java,java,面試,開發(fā)語言

真正存入元素時(shí),是加入了synchronized來加鎖保證線程安全

CAS + sizeCtl 和 synchronized 兩者共同保證了ConcurentHashMap 的線程安全!

ConcurrentHashMap 不支持 key 或者 value 為 null 的原因?

  1. 假設(shè) ConcurrentHashMap 允許存放值為 null 的 value,這時(shí)有A、B兩個(gè)線程,線程A調(diào)用ConcurrentHashMap.get(key)方法,返回為 null ,我們不知道這個(gè) null 是沒有映射的 null ,還是存的值就是 null 。
  2. 假設(shè)此時(shí),返回為 null 的真實(shí)情況是沒有找到對應(yīng)的 key。那么,我們可以用 ConcurrentHashMap.containsKey(key)來驗(yàn)證我們的假設(shè)是否成立,我們期望的結(jié)果是返回 false 。
  3. 但是在我們調(diào)用 ConcurrentHashMap.get(key)方法之后,containsKey方法之前,線程B執(zhí)行了ConcurrentHashMap.put(key, null)的操作。那么我們調(diào)用containsKey方法返回的就是 true 了,這就與我們的假設(shè)的真實(shí)情況不符合了,這就有了二義性。

JDK1.7 與 JDK1.8 中ConcurrentHashMap 的區(qū)別?

  1. 數(shù)據(jù)結(jié)構(gòu):取消了 Segment 分段鎖的數(shù)據(jù)結(jié)構(gòu),取而代之的是數(shù)組+鏈表+紅黑樹的結(jié)構(gòu)。
  2. 保證線程安全機(jī)制:JDK1.7 采用 Segment 的分段鎖機(jī)制實(shí)現(xiàn)線程安全,其中 Segment 繼承自 ReentrantLock 。JDK1.8 采用CAS+sizeCtl+synchronized保證線程安全。
  3. 鎖的粒度:JDK1.7 是對需要進(jìn)行數(shù)據(jù)操作的 Segment 加鎖,JDK1.8 調(diào)整為對每個(gè)數(shù)組元素加鎖(Node)。
  4. 鏈表轉(zhuǎn)化為紅黑樹:定位節(jié)點(diǎn)的 hash 算法簡化會(huì)帶來弊端,hash 沖突加劇,因此在鏈表節(jié)點(diǎn)數(shù)量到達(dá) 8(且數(shù)據(jù)總量大于等于 64)時(shí),會(huì)將鏈表轉(zhuǎn)化為紅黑樹進(jìn)行存儲。
  5. 查詢時(shí)間復(fù)雜度:從 JDK1.7的遍歷鏈表O(n), JDK1.8 變成遍歷紅黑樹O(logN)。

涉及到的多線程知識

CAS是啥?

CAS(CompareAnd Swap),就是比較并交換,是解決多線程情況下,解決使用鎖造成性能損耗問題的一種機(jī)制。

CAS是一種樂觀鎖機(jī)制,也被稱為無鎖機(jī)制。全稱: Compare-And-Swap。它是并發(fā)編程中的一種原子操作,通常用于多線程環(huán)境下實(shí)現(xiàn)同步和線程安全。CAS操作通過比較內(nèi)存中的值與期望值是否相等來確定是否執(zhí)行交換操作。如果相等,則執(zhí)行交換操作,否則不執(zhí)行。由于CAS是一種無鎖機(jī)制,因此它避免了使用傳統(tǒng)鎖所帶來的性能開銷和死鎖問題,提高了程序的并發(fā)性能。

CAS包含三個(gè)操作數(shù):

  • 變量內(nèi)存位置(V)
  • 預(yù)期的變量原值(A)
  • 變量的新值(B)

當(dāng)要對變量進(jìn)行修改時(shí),先會(huì)將內(nèi)存位置的值與預(yù)期的變量原值進(jìn)行比較,如果一致則將內(nèi)存位置更新為新值,否則不做操作,無論哪種情況都會(huì)返回內(nèi)存位置當(dāng)前的值。

比較并交換是啥?

Java進(jìn)階(ConcurrentHashMap)——面試時(shí)ConcurrentHashMap常見問題解讀 & 結(jié)合源碼分析 & 多線程CAS比較并交換 初識,Java,java,面試,開發(fā)語言

package com.tianju.test2;

import java.util.concurrent.atomic.AtomicInteger;

public class CASTest {
    public static void main(String[] args) {
        AtomicInteger atomicInteger = new AtomicInteger(5);
        System.out.println(atomicInteger.compareAndSet(5,2019));
        System.out.println(atomicInteger);
        System.out.println(atomicInteger.compareAndSet(5,2020));
        System.out.println(atomicInteger.compareAndSet(2019,2020));
        System.out.println(atomicInteger);
        System.out.println(atomicInteger.compareAndSet(2020,5));
        System.out.println(atomicInteger);
    }
}

CAS的優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

CAS是一種無鎖機(jī)制,因此它避免了使用傳統(tǒng)鎖所帶來的性能開銷和死鎖問題,提高了程序的并發(fā)性能。

缺點(diǎn):

CAS 有自旋鎖,如果不成功會(huì)一直循環(huán),可能會(huì)給 cpu 帶來很大開銷;

問題就是可能會(huì)造成 “ABA”;

解決方案:解決的思路就是引入類似樂觀鎖的版本號控制,不止比較預(yù)期值和內(nèi)存位置的值,還要比較版本號是否正確。

Java進(jìn)階(ConcurrentHashMap)——面試時(shí)ConcurrentHashMap常見問題解讀 & 結(jié)合源碼分析 & 多線程CAS比較并交換 初識,Java,java,面試,開發(fā)語言

AtomicStampedReference atomicStampedReference = new AtomicStampedReference(5, 1);

Java進(jìn)階(ConcurrentHashMap)——面試時(shí)ConcurrentHashMap常見問題解讀 & 結(jié)合源碼分析 & 多線程CAS比較并交換 初識,Java,java,面試,開發(fā)語言

package com.tianju.test2;

import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicStampedReference;

public class CASTest {
    public static void main(String[] args) {
        AtomicInteger atomicInteger = new AtomicInteger(5);
        System.out.println(atomicInteger.compareAndSet(5,2019));
        System.out.println(atomicInteger);
        System.out.println(atomicInteger.compareAndSet(5,2020));
        System.out.println(atomicInteger.compareAndSet(2019,2020));
        System.out.println(atomicInteger);
        System.out.println(atomicInteger.compareAndSet(2020,5));
        System.out.println(atomicInteger);

        System.out.println(" ########################################## ");
        AtomicStampedReference<Integer> atomicStampedReference = new AtomicStampedReference<>(5, 1);

        boolean flag1 = atomicStampedReference.compareAndSet(atomicStampedReference.getReference(), 2019,
                atomicStampedReference.getStamp(), 2);
        System.out.println("從5修改為2019:"+flag1);
        System.out.println(atomicStampedReference.getReference());

        boolean flag2 = atomicStampedReference.compareAndSet(atomicStampedReference.getReference(), 2020,
                atomicStampedReference.getStamp(), 3);
        System.out.println("從2019修改為2020:"+flag2);
        System.out.println(atomicStampedReference.getReference());

        boolean flag3 = atomicStampedReference.compareAndSet(2020, 5, 3, 4);
        System.out.println("從2020修改回5:"+flag3);
        System.out.println(atomicStampedReference.getReference());


    }
}

什么是CAS機(jī)制compareAndSwapInt

CAS是Java中Unsafe類里面的方法,它的全稱是CompareAndSwap,比較并交換的意思。它的主要功能是能夠保證在多線程環(huán)境下,對于共享變量的修改的原子性。

如下,成員變量state,默認(rèn)值是0,定義了一個(gè)方法doSomething(),這個(gè)方法的邏輯是判斷state是否為0,如果為0就修改成1。這個(gè)邏輯看起來沒有任何問題,但是在多線程環(huán)境下,會(huì)存在原子性的問題,因?yàn)檫@里是一個(gè)典型的,Read-Write的操作。

一般情況下,我們會(huì)在doSomething()這個(gè)方法上加同步鎖來解決原子性問題。

Java進(jìn)階(ConcurrentHashMap)——面試時(shí)ConcurrentHashMap常見問題解讀 & 結(jié)合源碼分析 & 多線程CAS比較并交換 初識,Java,java,面試,開發(fā)語言

package com.tianju.test2;

public class Demo1 {
    private int state = 0;
    public void doSomething(){
        if (state==0){
            state=1;
        }
    }
}

但是,加同步鎖,會(huì)帶來性能上的損耗,所以,對于這類場景,我們就可以使用CAS機(jī)制來進(jìn)行優(yōu)化

Java進(jìn)階(ConcurrentHashMap)——面試時(shí)ConcurrentHashMap常見問題解讀 & 結(jié)合源碼分析 & 多線程CAS比較并交換 初識,Java,java,面試,開發(fā)語言

package com.tianju.test2;


import sun.misc.Unsafe;

public class Demo2 {
    private volatile int state = 0;
    private static final Unsafe UNSAFE = Unsafe.getUnsafe();
    private static final long stateOffset;

    static {
        try {
            stateOffset = UNSAFE.objectFieldOffset(
                    Demo2.class.getDeclaredField("state")
            );
        } catch (NoSuchFieldException e) {
            throw new RuntimeException(e);
        }
    }

    public void doSomething(){
        if (UNSAFE.compareAndSwapInt(this,stateOffset,0,1)){
            state=1;
        }
    }
}

在doSomething()方法中,我們調(diào)用了unsafe類中的compareAndSwapInt()方法來達(dá)到同樣的目的,這個(gè)方法有四個(gè)參數(shù),分別是:
當(dāng)前對象實(shí)例、成員變量state在內(nèi)存地址中的偏移量、預(yù)期值0、期望更改之后的值1。

CAS機(jī)制會(huì)比較state內(nèi)存地址偏移量對應(yīng)的值和傳入的預(yù)期值0是否相等,如果相等,就直接修改內(nèi)存地址中state的值為1。否則,返回false,表示修改失敗,而這個(gè)過程是原子的,不會(huì)存在線程安全問題。

CompareAndSwap是一個(gè)native方法,實(shí)際上它最終還是會(huì)面臨同樣的問題,就是先從內(nèi)存地址中讀取state的值,然后去比較,最后再修改。

這個(gè)過程不管是在什么層面上實(shí)現(xiàn),都會(huì)存在原子性問題。所以,CompareAndSwap的底層實(shí)現(xiàn)中,在多核CPU環(huán)境下,會(huì)增加一個(gè)Lock指令對緩存或者總線加鎖,從而保證比較并替換這兩個(gè)指令的原子性。

CAS主要用在并發(fā)場景中,比較典型的使用場景有兩個(gè):

  1. 第一個(gè)是J.U.C里面Atomic的原子實(shí)現(xiàn),比如AtomicInteger,AtomicLong。
  2. 第二個(gè)是實(shí)現(xiàn)多線程對共享資源競爭的互斥性質(zhì),比如在AQS、ConcurrentHashMap、ConcurrentLinkedQueue等都有用到。

總結(jié)

1.從結(jié)構(gòu)上來說jdk7中,ConcurentHashMap是采用Segment段數(shù)組 + Entry數(shù)組 + 單鏈表結(jié)構(gòu);
2.從結(jié)構(gòu)上來說jdk8中,ConcurentHashMap 與 HashMap的結(jié)構(gòu)是一模一樣的
3.ConcurrentHashMap 不支持 key 或者 value 為 null ,避免歧義;
4.JDK1.7和1.8的區(qū)別:

  1. 數(shù)據(jù)結(jié)構(gòu):取消了 Segment 分段鎖的數(shù)據(jù)結(jié)構(gòu),取而代之的是數(shù)組+鏈表+紅黑樹的結(jié)構(gòu)。
  2. 保證線程安全機(jī)制:JDK1.7 采用 Segment 的分段鎖機(jī)制實(shí)現(xiàn)線程安全,其中 Segment 繼承自 ReentrantLock 。JDK1.8 采用CAS+sizeCtl+synchronized保證線程安全。
  3. 鎖的粒度:JDK1.7 是對需要進(jìn)行數(shù)據(jù)操作的 Segment 加鎖,JDK1.8 調(diào)整為對每個(gè)數(shù)組元素加鎖(Node)。
  4. 鏈表轉(zhuǎn)化為紅黑樹:定位節(jié)點(diǎn)的 hash 算法簡化會(huì)帶來弊端,hash 沖突加劇,因此在鏈表節(jié)點(diǎn)數(shù)量到達(dá) 8(且數(shù)據(jù)總量大于等于 64)時(shí),會(huì)將鏈表轉(zhuǎn)化為紅黑樹進(jìn)行存儲。
  5. 查詢時(shí)間復(fù)雜度:從 JDK1.7的遍歷鏈表O(n), JDK1.8 變成遍歷紅黑樹O(logN)。

5.CAS是一種樂觀鎖機(jī)制,也被稱為無鎖機(jī)制

到了這里,關(guān)于Java進(jìn)階(ConcurrentHashMap)——面試時(shí)ConcurrentHashMap常見問題解讀 & 結(jié)合源碼分析 & 多線程CAS比較并交換 初識的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【多線程進(jìn)階】信號量,線程安全集合類,Hashtable與ConcurrentHashMap的區(qū)別,多線程常見的面試題

    【多線程進(jìn)階】信號量,線程安全集合類,Hashtable與ConcurrentHashMap的區(qū)別,多線程常見的面試題

    前言: 大家好,我是 良辰丫 ,今天學(xué)習(xí)多線程最后一節(jié)內(nèi)容,我們主要去了解信號量,線程安全集合類,Hashtable與ConcurrentHashMap的區(qū)別,多線程常見的面試題,我們需要重點(diǎn)去掌握,?????? ??個(gè)人主頁:良辰針不戳 ??所屬專欄:javaEE初階 ??勵(lì)志語句:生活也許會(huì)讓我們遍體鱗傷,

    2023年04月27日
    瀏覽(30)
  • 面試-Dubbo常見問題

    Dubbo 是一個(gè)RPC框架,包含注冊中心,服務(wù)提供方,服務(wù)消費(fèi)方,控制臺,監(jiān)控中心。 Dubbo 啟動(dòng)時(shí)會(huì)從注冊中心拉取消費(fèi)者需要的提供方信息,如果依賴的服務(wù)提供方不可用,Dubbo消費(fèi)方會(huì)啟動(dòng)失敗,并且不停的向注冊中心請求提供方信息,拋出異常找不到對應(yīng)的提供方。可以

    2024年02月08日
    瀏覽(24)
  • JavaEE 面試常見問題

    JavaEE 面試常見問題

    Mybatis 是一種典型的半自動(dòng)的 ORM 框架,所謂的半自動(dòng),是因?yàn)檫€需要手動(dòng)的寫 SQL 語句,再由框架根據(jù) SQL 及 傳入數(shù)據(jù)來組裝為要執(zhí)行的 SQL 。其優(yōu)點(diǎn)為: 1. 因?yàn)橛沙绦騿T自己寫 SQL ,相對來說學(xué)習(xí)門檻更低,更容易入門。 2. 更方便做 SQL 的性能優(yōu)化及維護(hù)。 3. 對關(guān)系型數(shù)據(jù)

    2024年02月14日
    瀏覽(36)
  • 項(xiàng)目經(jīng)理崗面試常見問題

    一、注意事項(xiàng) ? ·電面邀約確認(rèn)(避免hr刷KPI): 請問貴司招聘的是什么崗位,是新建團(tuán)隊(duì)還是原有團(tuán)隊(duì)? 這邊面試流程是怎樣的,是 leader 直接面,還是? ? ·面試前鋪墊: 如果您對某部分感興趣,請隨時(shí)打斷我。 ? ·面試中發(fā)揮: 盡量采用 STAR 原則回答,即 情境( Si

    2024年02月05日
    瀏覽(30)
  • JVM基礎(chǔ),面試常見問題

    JVM基礎(chǔ),面試常見問題

    目錄 一.運(yùn)行時(shí)數(shù)據(jù)區(qū)域 1.線程獨(dú)享 (1)棧 (2)程序計(jì)數(shù)器 2.線程共享 (1)方法區(qū) (2)堆 二.內(nèi)存如何分配 1.指針碰撞法 2.空閑列表法 3.TLAB 三.對象在內(nèi)存中的組成 1.對象頭 (1)markword (2)指向類型的指針 (3)如果是數(shù)組-》數(shù)組長度 2.實(shí)例數(shù)據(jù) 3.對齊填充 四.如何訪

    2024年01月23日
    瀏覽(21)
  • 【數(shù)據(jù)結(jié)構(gòu)面試常見問題】

    【數(shù)據(jù)結(jié)構(gòu)面試常見問題】

    數(shù)據(jù)結(jié)構(gòu)作為計(jì)算機(jī)的一門基礎(chǔ)學(xué)科,它在面試中占有很大的比重,本科階段,我們也學(xué)過數(shù)據(jù)結(jié)構(gòu)與算法,內(nèi)容比較多,也比較難,尤其是圖的應(yīng)用以及各類查找和排序算法,這些也都是核心內(nèi)容。數(shù)據(jù)結(jié)構(gòu)在實(shí)際的應(yīng)用中也比較多,因此,整理一些常見的筆試、面試的數(shù)

    2024年03月22日
    瀏覽(15)
  • 單片機(jī)面試常見問題

    1、中斷的概念?簡述中斷的過程 (1)中斷:指CPU在正常執(zhí)行程序的過程中,由于內(nèi)部/外部事件的觸發(fā)或由程序的預(yù)先安排,引起CPU暫時(shí)中斷當(dāng)前正在運(yùn)行的程序,轉(zhuǎn)而執(zhí)行為內(nèi)部/外部事件或程序預(yù)先安排的事件的服務(wù)子程序,待中斷服務(wù)子程序執(zhí)行完畢后,CPU再返回到被

    2024年04月10日
    瀏覽(23)
  • kubernetes常見面試問題詳解

    kubernetes常見面試問題詳解

    在面試的時(shí)候,面試官常常會(huì)問一些問題: k8s是什么?有什么用? k8s由哪些組件組成? pod的啟動(dòng)流程? k8s里有哪些控制器? k8s的調(diào)度器里有哪些調(diào)度算法? pod和pod之間的通信過程? 外面用戶訪問pod數(shù)據(jù)流程? 你常用哪些命令? 容器的類型? 3種探針? pod的升級? HPA、V

    2024年02月10日
    瀏覽(21)
  • 大數(shù)據(jù)常見面試問題匯總

    目錄 第1章 核心技術(shù) 1.1 LinuxShell 1.1.1 Linux常用高級命令 1.1.2 Shell常用工具及寫過的腳本 1.1.3 Shell中單引號和雙引號區(qū)別 1.2 Hadoop 1.2.1 Hadoop常用端口號 1.2.2 HDFS讀流程和寫流程 1.2.3 HDFS小文件處理 1.2.4 HDFS的NameNode內(nèi)存 1.2.5 Shuffle及優(yōu)化 1.2.6 Yarn工作機(jī)制 1.2.7 Yarn調(diào)度器 1.2.8 HDFS塊大

    2024年02月14日
    瀏覽(21)
  • List常見面試問題

    List常見面試問題

    Java中的List是一種存放有序的、可以重復(fù)的數(shù)據(jù)的集合,它允許重復(fù)元素的存在。List中的元素都有對應(yīng)的一個(gè)序列號(索引)記錄著元素的位置,因此可以通過這個(gè)序列號來訪問元素。 ? Java中的List有三種實(shí)現(xiàn)方式:ArrayList、LinkedList和Vector。其中,ArrayList是基于數(shù)組實(shí)現(xiàn)的,

    2024年02月09日
    瀏覽(15)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包