1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        面試官:Java 有線程安全的 set 嗎?我竟然答不上來(lái)。

        共 1686字,需瀏覽 4分鐘

         ·

        2021-11-15 09:14

        來(lái)源:blog.csdn.net/li_canhui/article/details/91393247
        =?0???false?:????????addIfAbsent(e,?snapshot);}private?static?int?indexOf(Object?o,?Object[]?elements,???????????????????????????int?index,?int?fence)?{????if?(o?==?null)?{????????for?(int?i?=?index;?i?=?0)????????????????????return?false;????????}????????Object[]?newElements?=?Arrays.copyOf(current,?len?+?1);????????newElements[len]?=?e;????????setArray(newElements);????????return?true;????}?finally?{????????lock.unlock();????}}從源碼可以看出,CopyOnWriteArraySet底層采用了CopyOnWriteArrayList數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)。在add元素時(shí),采用的是可重入鎖來(lái)實(shí)現(xiàn)線程安全。" data-itemshowtype="0" tab="innerlink" data-linktype="2" hasload="1" wah-hotarea="click" style="outline: 0px; color: rgb(58, 58, 58); -webkit-tap-highlight-color: rgba(0, 0, 0, 0); cursor: pointer;">在多線程環(huán)境下,要使用線程安全的集合,比如,ConcurrentHashMap是線程安全的HashMap,CopyOnWriteArrayList是線程安全的ArrayList。
        =?0???false?:????????addIfAbsent(e,?snapshot);}private?static?int?indexOf(Object?o,?Object[]?elements,???????????????????????????int?index,?int?fence)?{????if?(o?==?null)?{????????for?(int?i?=?index;?i?=?0)????????????????????return?false;????????}????????Object[]?newElements?=?Arrays.copyOf(current,?len?+?1);????????newElements[len]?=?e;????????setArray(newElements);????????return?true;????}?finally?{????????lock.unlock();????}}從源碼可以看出,CopyOnWriteArraySet底層采用了CopyOnWriteArrayList數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)。在add元素時(shí),采用的是可重入鎖來(lái)實(shí)現(xiàn)線程安全。" data-itemshowtype="0" tab="innerlink" data-linktype="2" hasload="1" wah-hotarea="click" style="outline: 0px; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); cursor: pointer;">那么HashSet對(duì)應(yīng)的線程安全集合,是什么呢?java有沒(méi)有提供默認(rèn)實(shí)現(xiàn)呢?
        =?0???false?:????????addIfAbsent(e,?snapshot);}private?static?int?indexOf(Object?o,?Object[]?elements,???????????????????????????int?index,?int?fence)?{????if?(o?==?null)?{????????for?(int?i?=?index;?i?=?0)????????????????????return?false;????????}????????Object[]?newElements?=?Arrays.copyOf(current,?len?+?1);????????newElements[len]?=?e;????????setArray(newElements);????????return?true;????}?finally?{????????lock.unlock();????}}從源碼可以看出,CopyOnWriteArraySet底層采用了CopyOnWriteArrayList數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)。在add元素時(shí),采用的是可重入鎖來(lái)實(shí)現(xiàn)線程安全。" data-itemshowtype="0" tab="innerlink" data-linktype="2" hasload="1" wah-hotarea="click" style="outline: 0px; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); cursor: pointer;">在java的concurrent包中,我找到了CopyOnWriteArraySet,那么它是線程安全的嗎?下面是測(cè)試代碼。
        =?0???false?:????????addIfAbsent(e,?snapshot);}private?static?int?indexOf(Object?o,?Object[]?elements,???????????????????????????int?index,?int?fence)?{????if?(o?==?null)?{????????for?(int?i?=?index;?i?=?0)????????????????????return?false;????????}????????Object[]?newElements?=?Arrays.copyOf(current,?len?+?1);????????newElements[len]?=?e;????????setArray(newElements);????????return?true;????}?finally?{????????lock.unlock();????}}從源碼可以看出,CopyOnWriteArraySet底層采用了CopyOnWriteArrayList數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)。在add元素時(shí),采用的是可重入鎖來(lái)實(shí)現(xiàn)線程安全。" data-itemshowtype="0" tab="innerlink" data-linktype="2" hasload="1" wah-hotarea="click" style="outline: 0px; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); cursor: pointer;">public?static?void?main(String[]?args)?{
        ????Set?set?=?new?CopyOnWriteArraySet<>();
        ????ExecutorService?service?=?Executors.newFixedThreadPool(12);
        ????int?times?=?10000;
        ????AtomicInteger?flag?=?new?AtomicInteger(0);
        ????for(int?i?=?0;?i?times;?i?++){
        ????????service.execute(()->{
        ????????????set.add("a"?+?flag.getAndAdd(1));
        ????????});
        ????}
        ????service.shutdown();
        ????try?{
        ????????service.awaitTermination(Long.MAX_VALUE,?TimeUnit.DAYS);
        ????}catch?(Exception?e){
        ????????e.printStackTrace();
        ????}
        ????System.out.println(set.size());
        }
        =?0???false?:????????addIfAbsent(e,?snapshot);}private?static?int?indexOf(Object?o,?Object[]?elements,???????????????????????????int?index,?int?fence)?{????if?(o?==?null)?{????????for?(int?i?=?index;?i?=?0)????????????????????return?false;????????}????????Object[]?newElements?=?Arrays.copyOf(current,?len?+?1);????????newElements[len]?=?e;????????setArray(newElements);????????return?true;????}?finally?{????????lock.unlock();????}}從源碼可以看出,CopyOnWriteArraySet底層采用了CopyOnWriteArrayList數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)。在add元素時(shí),采用的是可重入鎖來(lái)實(shí)現(xiàn)線程安全。" data-itemshowtype="0" tab="innerlink" data-linktype="2" wah-hotarea="click" hasload="1" style="outline: 0px; color: rgb(58, 58, 58); -webkit-tap-highlight-color: rgba(0, 0, 0, 0); cursor: pointer;">經(jīng)過(guò)多次執(zhí)行,結(jié)果都是10000。可以說(shuō)明,CopyOnWriteArraySet是線程安全的Set。
        =?0???false?:????????addIfAbsent(e,?snapshot);}private?static?int?indexOf(Object?o,?Object[]?elements,???????????????????????????int?index,?int?fence)?{????if?(o?==?null)?{????????for?(int?i?=?index;?i?=?0)????????????????????return?false;????????}????????Object[]?newElements?=?Arrays.copyOf(current,?len?+?1);????????newElements[len]?=?e;????????setArray(newElements);????????return?true;????}?finally?{????????lock.unlock();????}}從源碼可以看出,CopyOnWriteArraySet底層采用了CopyOnWriteArrayList數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)。在add元素時(shí),采用的是可重入鎖來(lái)實(shí)現(xiàn)線程安全。" data-itemshowtype="0" tab="innerlink" data-linktype="2" wah-hotarea="click" hasload="1" style="outline: 0px; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); cursor: pointer;">那么CopyOnWriteArraySet是如何保證寫入時(shí)的線程安全呢?以下是CopyOnWriteArraySet的add源碼。
        =?0???false?:????????addIfAbsent(e,?snapshot);}private?static?int?indexOf(Object?o,?Object[]?elements,???????????????????????????int?index,?int?fence)?{????if?(o?==?null)?{????????for?(int?i?=?index;?i?=?0)????????????????????return?false;????????}????????Object[]?newElements?=?Arrays.copyOf(current,?len?+?1);????????newElements[len]?=?e;????????setArray(newElements);????????return?true;????}?finally?{????????lock.unlock();????}}從源碼可以看出,CopyOnWriteArraySet底層采用了CopyOnWriteArrayList數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)。在add元素時(shí),采用的是可重入鎖來(lái)實(shí)現(xiàn)線程安全。" data-itemshowtype="0" tab="innerlink" data-linktype="2" wah-hotarea="click" hasload="1" style="outline: 0px; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); cursor: pointer;">public?boolean?add(E?e)?{
        ????return?al.addIfAbsent(e);
        }
        public?boolean?addIfAbsent(E?e)?{
        ????Object[]?snapshot?=?getArray();
        ????return?indexOf(e,?snapshot,?0,?snapshot.length)?>=?0???false?:
        ????????addIfAbsent(e,?snapshot);
        }
        private?static?int?indexOf(Object?o,?Object[]?elements,
        ???????????????????????????int?index,?int?fence)?{
        ????if?(o?==?null)?{
        ????????for?(int?i?=?index;?i?????????????if?(elements[i]?==?null)
        ????????????????return?i;
        ????}?else?{
        ????????for?(int?i?=?index;?i?????????????if?(o.equals(elements[i]))
        ????????????????return?i;
        ????}
        ????return?-1;
        }
        private?boolean?addIfAbsent(E?e,?Object[]?snapshot)?{
        ????final?ReentrantLock?lock?=?this.lock;
        ????lock.lock();
        ????try?{
        ????????Object[]?current?=?getArray();
        ????????int?len?=?current.length;
        ????????if?(snapshot?!=?current)?{
        ????????????//?Optimize?for?lost?race?to?another?addXXX?operation
        ????????????int?common?=?Math.min(snapshot.length,?len);
        ????????????for?(int?i?=?0;?i?????????????????if?(current[i]?!=?snapshot[i]?&&?eq(e,?current[i]))
        ????????????????????return?false;
        ????????????if?(indexOf(e,?current,?common,?len)?>=?0)
        ????????????????????return?false;
        ????????}
        ????????Object[]?newElements?=?Arrays.copyOf(current,?len?+?1);
        ????????newElements[len]?=?e;
        ????????setArray(newElements);
        ????????return?true;
        ????}?finally?{
        ????????lock.unlock();
        ????}
        }

        =?0???false?:????????addIfAbsent(e,?snapshot);}private?static?int?indexOf(Object?o,?Object[]?elements,???????????????????????????int?index,?int?fence)?{????if?(o?==?null)?{????????for?(int?i?=?index;?i?=?0)????????????????????return?false;????????}????????Object[]?newElements?=?Arrays.copyOf(current,?len?+?1);????????newElements[len]?=?e;????????setArray(newElements);????????return?true;????}?finally?{????????lock.unlock();????}}從源碼可以看出,CopyOnWriteArraySet底層采用了CopyOnWriteArrayList數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)。在add元素時(shí),采用的是可重入鎖來(lái)實(shí)現(xiàn)線程安全。" data-itemshowtype="0" tab="innerlink" data-linktype="2" wah-hotarea="click" hasload="1" style="outline: 0px; color: rgb(58, 58, 58); -webkit-tap-highlight-color: rgba(0, 0, 0, 0); cursor: pointer;">從源碼可以看出,CopyOnWriteArraySet底層采用了CopyOnWriteArrayList數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)。在add元素時(shí),采用的是可重入鎖來(lái)實(shí)現(xiàn)線程安全。


        END


        推薦閱讀

        一鍵生成Springboot & Vue項(xiàng)目!【畢設(shè)神器】

        Java可視化編程工具系列(一)

        Java可視化編程工具系列(二)


        順便給大家推薦一個(gè)GitHub項(xiàng)目,這個(gè) GitHub 整理了上千本常用技術(shù)PDF,絕大部分核心的技術(shù)書籍都可以在這里找到,

        GitHub地址:https://github.com/javadevbooks/books

        Gitee地址:https://gitee.com/javadevbooks/books

        電子書已經(jīng)更新好了,你們需要的可以自行下載了,記得點(diǎn)一個(gè)star,持續(xù)更新中..



        瀏覽 42
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            青青草久九在线观看久久国区一线 | 日本 无码一区二区 | 日本大尺度吃奶做爰过程 | 欧美老肥婆色情免费网站 | 温碧霞三级做爰电影 | 中文字幕1区 | 欧美黄片在线 | 亚洲综合在线播放 | chinese麻豆videosex | 国产精品成人无码A片直播 |