最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中的CopyOnWriteArrayList詳解

 更新時間:2023年12月18日 10:38:12   作者:暴躁的程序猿啊  
這篇文章主要介紹了Java中的CopyOnWriteArrayList詳解,ArrayList單線程下是安全的 但是多線程下存在不安全的問題,多線程下是不安全的,需要的朋友可以參考下

引入

ArrayList單線程下是安全的 但是多線程下存在不安全的問題

多線程下是不安全的

例如: 我們開啟多個線程向arraylist添加數(shù)據(jù)

public class ListTest {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            new Thread(()->{
                list.add("a");
            System.out.println(list);
            }).start();
        }
    }
}

報出異常

在這里插入圖片描述

解決這個問題我們可以使用集合工具類創(chuàng)建線程安全的ArrayList

  List<String> strings = Collections.synchronizedList(new ArrayList<String>());
    for (int i = 0; i < 101; i++) {
        new Thread(()->{
            strings.add("a");
            System.out.println(strings);
        }).start();
    }
}

在這里插入圖片描述

但加入synchronized此時效率較低

所以我們可以使用juc包中的 CopyOnWriterArrayList

CopyOnWriterArrayList

CopyOnWriteArrayList (拷貝寫數(shù)組) 是ArrayList線程安全的集合

其中所有可變操作(add、set等等)都是通過對底層數(shù)組進(jìn)行一次新的復(fù)制來實(shí)現(xiàn)的。

適合場景:讀多、寫少的并發(fā)場景

cow思想

它不存在“擴(kuò)容”的概念,每次寫操作(add 、remove)都要copy一個副本,在副本的基礎(chǔ)上修改后改變array引用,所以稱為“CopyOnWrite”,因此在寫操作是加鎖,并且對整個list的copy操作時相當(dāng)耗時的,過多的寫操作不推薦使用該存儲結(jié)構(gòu)。

讀取的方法沒有加鎖 寫的時候才加鎖 所以性能 比 vector高

我們可以從源碼中看出

public E get(int index) {
    return get(getArray(), index);
}
final Object[] getArray() {
    return array;
}
private E get(Object[] a, int index) {
    return (E) a[index];
}

讀操作并沒有加鎖 這也是效率高的原因

add源碼

寫操作加入了 lock鎖

public boolean add(E e) {
    final ReentrantLock lock = this.lock;
    lock.lock();
    try {
        Object[] elements = getArray();
        int len = elements.length;
        Object[] newElements = Arrays.copyOf(elements, len + 1);
        newElements[len] = e;
        setArray(newElements);
        return true;
    } finally {
        lock.unlock();
    }
}

(注:新版本jdk1.8后改成了synchronized 因?yàn)樾掳姹緦ynchronized進(jìn)行了升級提升了效率)

使用示例:

public class ListTest {
    public static void main(String[] args) {
        List<String> list = new CopyOnWriteArrayList<>();
        for (int i = 0; i < 101; i++) {
            new Thread(()->{
                list.add("a");
                System.out.println(list);
            }).start();
        }
    }
}

在這里插入圖片描述

缺點(diǎn):

內(nèi)存問題:CopyOnWrite的寫復(fù)制機(jī)制,在進(jìn)行寫操作的時候,內(nèi)存里會同時駐存在兩個對象的內(nèi)存,舊的對象和新寫入的對象(注意:在復(fù)制的時候只是復(fù)制容器里的引用,只是在寫的時候會創(chuàng)建新對 象添加到新容器里,而舊容器的對象還在使用,所以有兩份對象內(nèi)存)。如果這些對象占用的內(nèi)存比較大,比如說100M左右,那么再寫入50M數(shù)據(jù)進(jìn)去,內(nèi)存就會占用150M,那么這個時候很有可能造成頻繁的minor GC和major GC。

數(shù)據(jù)一致性問題:CopyOnWrite容器只能保證數(shù)據(jù)的最終一致性,不能保證數(shù)據(jù)的實(shí)時一致性。所以如果你希望寫入的的數(shù)據(jù),馬上能讀到,請不要使用CopyOnWrite容器。

到此這篇關(guān)于Java中的CopyOnWriteArrayList詳解的文章就介紹到這了,更多相關(guān)CopyOnWriteArrayList詳解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java常見啟動命令-jar、-server和-cp詳細(xì)比較

    Java常見啟動命令-jar、-server和-cp詳細(xì)比較

    這篇文章主要給大家介紹了關(guān)于Java常見啟動命令-jar、-server和-cp詳細(xì)比較的相關(guān)資料,該文總結(jié)了常歸的jar包的啟動方式,并分析各種啟動方式的區(qū)別,需要的朋友可以參考下
    2023-07-07
  • IntelliJ IDEA運(yùn)行bat腳本,自動taskkill端口進(jìn)程

    IntelliJ IDEA運(yùn)行bat腳本,自動taskkill端口進(jìn)程

    這篇文章主要介紹了IDEA里面無法運(yùn)行bat文件的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • MyBatis-Plus執(zhí)行SQL分析打印過程

    MyBatis-Plus執(zhí)行SQL分析打印過程

    這篇文章主要介紹了MyBatis-Plus執(zhí)行SQL分析打印過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 從零搭建Spring Boot腳手架整合OSS作為文件服務(wù)器的詳細(xì)教程

    從零搭建Spring Boot腳手架整合OSS作為文件服務(wù)器的詳細(xì)教程

    這篇文章主要介紹了從零搭建Spring Boot腳手架整合OSS作為文件服務(wù)器的詳細(xì)教程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • SpringBoot給所有接口配置跨域的方法詳解

    SpringBoot給所有接口配置跨域的方法詳解

    簡單而言,跨域請求就是當(dāng)一臺服務(wù)器資源從另一臺服務(wù)器(不同 的域名或者端口)請求一個資源或者接口,就會發(fā)起一個跨域 HTTP 請求,本文給大家介紹了SpringBoot給所有接口配置跨域的方法,需要的朋友可以參考下
    2025-09-09
  • 如何利用Java?AWT?創(chuàng)建一個簡易計(jì)算器

    如何利用Java?AWT?創(chuàng)建一個簡易計(jì)算器

    這篇文章主要介紹了如何利用Java?AWT?創(chuàng)建一個簡易計(jì)算器,AWT?是一個有助于構(gòu)建?GUI?的?API?基于?java?應(yīng)用程序,下面關(guān)于其相關(guān)資料實(shí)現(xiàn)計(jì)算器的內(nèi)容詳細(xì),需要的朋友可以參考一下
    2022-03-03
  • Java代理模式詳細(xì)解析

    Java代理模式詳細(xì)解析

    這篇文章主要為大家詳細(xì)介紹了Java代理模式的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • 線程池之newFixedThreadPool定長線程池的實(shí)例

    線程池之newFixedThreadPool定長線程池的實(shí)例

    這篇文章主要介紹了線程池之newFixedThreadPool定長線程池的實(shí)例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Springboot中yml文件不生效原因分析及解決方案

    Springboot中yml文件不生效原因分析及解決方案

    本文介紹了SpringBoot項(xiàng)目中YML文件不生效的常見原因及解決方案,包括格式錯誤、文件名錯誤、配置文件位置、激活的Profile、yml文件未加載、依賴問題、環(huán)境變量覆蓋和代碼中的硬編碼配置,通過以下步驟,可以解決大部分YML文件配置不生效的問題
    2024-11-11
  • 基于Java網(wǎng)絡(luò)編程和多線程的多對多聊天系統(tǒng)

    基于Java網(wǎng)絡(luò)編程和多線程的多對多聊天系統(tǒng)

    這篇文章主要介紹了基于Java網(wǎng)絡(luò)編程和多線程的多對多聊天系統(tǒng),文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java網(wǎng)絡(luò)編程的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04

最新評論

盐池县| 天气| 巴南区| 曲周县| 黄浦区| 柘荣县| 三门峡市| 瑞安市| 安仁县| 花莲县| 宝坻区| 全南县| 郯城县| 安岳县| 嘉禾县| 三门县| 图们市| 庄河市| 离岛区| 丘北县| 五华县| 剑阁县| 肥东县| 宁河县| 保靖县| 石城县| 中超| 绵阳市| 嘉鱼县| 无为县| 涿州市| 钟山县| 肇州县| 沙坪坝区| 政和县| 育儿| 湘潭市| 塘沽区| 南川市| 阿拉善盟| 邯郸县|