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

JavaEE 初階篇-線程安全的集合類、多線程環(huán)境使用 ArrayList、隊列、哈希表(HashMap 、ConCurrentHashMap 、HashTable 的區(qū)別)

這篇具有很好參考價值的文章主要介紹了JavaEE 初階篇-線程安全的集合類、多線程環(huán)境使用 ArrayList、隊列、哈希表(HashMap 、ConCurrentHashMap 、HashTable 的區(qū)別)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

??博客主頁:?【小扳_-CSDN博客】
?感謝大家點贊??收藏?評論?
?

java保存線程的集合,JavaEE 初級篇,java,jvm,開發(fā)語言,java-ee,安全,大數(shù)據(jù)

java保存線程的集合,JavaEE 初級篇,java,jvm,開發(fā)語言,java-ee,安全,大數(shù)據(jù)

文章目錄

? ? ? ? 1.0 線程安全的集合類

? ? ? ? 1.2?線程安全的集合類 - Vector

? ? ? ? 1.3 線程安全的集合類 - Stack

? ? ? ? 1.4 線程安全的集合類 - HashTable

? ? ? ? 2.0 多線程環(huán)境使用 ArrayList

? ? ? ? 2.1 對 ArrayList 關(guān)鍵方法手動加鎖

? ? ? ? 2.2 利用 Collections.synchronized(new ArrayList) 方法創(chuàng)建

? ? ? ? 2.3 使用 CopyOnWriteArrayList 容器

? ? ? ? 3.0 多線程環(huán)境使用隊列

? ? ? ? 4.0 多線程環(huán)境使用哈希表

????????4.1 HashTable 類

? ? ? ? 4.2 ConcurrentHashMap 類


? ? ? ? 1.0 線程安全的集合類

? ? ? ? 對于原來熟悉的集合類,大部分都是不是線程安全的。

? ? ? ? 1.2?線程安全的集合類 - Vector

????????實現(xiàn)了動態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu),可以根據(jù)需要動態(tài)增長或縮小。

? ? ? ? Vector 是一個線程安全的集合類主要來自以下幾個方面:

? ? ? ? 1)同步方法:Vector 中的所有方法都使用了 synchronized 關(guān)鍵字進(jìn)行同步,確保在多線程環(huán)境下對集合的操作是線程安全的。這意味著在對 Vector 進(jìn)行增刪改查等操作時,會對整個集合對象進(jìn)行加鎖,從而保證同一時刻只有一個線程能夠訪問集合。

? ? ? ? 2)迭代器同步:Vector 的迭代器是通過同步方法 synchronized 來實現(xiàn)的,這樣在迭代過程中,其他線程無法修改集合,避免了并發(fā)修改異常。

? ? ? ? 1.3 線程安全的集合類 - Stack

????????是 Java 中表示堆棧(棧)數(shù)據(jù)結(jié)構(gòu)的類,它繼承自 Vector 類,因此也是線程安全的集合類。所有方法都使用了 synchronized 關(guān)鍵字進(jìn)行同步,確保在多線程環(huán)境下對棧的操作是線程安全的。

? ? ? ? 1.4 線程安全的集合類 - HashTable

????????HashTable 是基于哈希表的數(shù)據(jù)結(jié)構(gòu),使用鍵值對存儲數(shù)據(jù),類似于 HashMap。鍵和值都不允許為 null ,并且 HashTable 的鍵值對是無序的。

????????是一個線程安全的集合類,所有對 HashTable 的操作都是同步的,即線程安全的。在每個公共方法中都使用了 synchronized 關(guān)鍵字,確保多線程環(huán)境下的并發(fā)訪問是安全的。

? ? ? ? 2.0 多線程環(huán)境使用 ArrayList

? ? ? ? 2.1 對 ArrayList 關(guān)鍵方法手動加鎖

????????自己使用同步機(jī)制,自己手動對關(guān)鍵操作方法加上鎖。如 synchronized 或者 ReentrantLock 。

? ? ? ? 2.2 利用 Collections.synchronized(new ArrayList) 方法創(chuàng)建

創(chuàng)建方式:

List<String> synchronizedList = Collections.synchronizedList(normalList);

代碼如下:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class SynchronizedListExample {
    public static void main(String[] args) {
        // 創(chuàng)建一個普通的 ArrayList
        List<String> normalList = new ArrayList<>();

        // 使用 Collections.synchronizedList 方法創(chuàng)建一個線程安全的 List
        List<String> synchronizedList = Collections.synchronizedList(normalList);

        // 在多線程環(huán)境下操作 synchronizedList 是線程安全的
        // 可以對 synchronizedList 進(jìn)行添加、刪除、遍歷等操作而不用擔(dān)心線程安全性

        // 示例:在多線程環(huán)境下添加元素
        Runnable addTask = () -> {
            synchronizedList.add("Element");
            System.out.println("Added element by thread: " + Thread.currentThread().getName());
        };

        // 創(chuàng)建多個線程來添加元素
        Thread thread1 = new Thread(addTask);
        Thread thread2 = new Thread(addTask);

        thread1.start();
        thread2.start();

        // 等待線程執(zhí)行完成
        try {
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 打印最終的 synchronizedList
        System.out.println("Final synchronizedList: " + synchronizedList);
    }
}

? ? ? ? 2.3 使用 CopyOnWriteArrayList 容器

? ? ? ? CopyOnWriteArrayList 容器即寫時復(fù)制的容器。

? ? ? ? 當(dāng)我們往一個容器中添加元素時,不會直接往當(dāng)前容器中添加,而是先將當(dāng)前容器進(jìn)行 Copy,復(fù)制出一個新的容器,然后往新的容器里添加元素。

? ? ? ? 添加完畢元素之后,再將原容器的引用指向新的容器。

優(yōu)點:

? ? ? ? 1)這樣做的好處是我們對 CopyOnWrite 容器進(jìn)行并發(fā)的讀,而不需要加鎖,因為當(dāng)前的容器不會添加任何元素。所以 CopyOnWrite 容器也是一種讀寫分離的思想,讀和寫不同的容器。

? ? ? ? 2)在讀多寫少的場景下,性能很好,不需要加鎖競爭。

缺點:

? ? ? ? 1)占用內(nèi)存較多。

? ? ? ? 2)新寫的數(shù)據(jù)不能被第一時間讀取到。

代碼如下:

import java.util.concurrent.CopyOnWriteArrayList;

public class CopyOnWriteArrayListExample {
    public static void main(String[] args) {
        CopyOnWriteArrayList<String> copyOnWriteList = new CopyOnWriteArrayList<>();

        // 添加元素
        copyOnWriteList.add("Element 1");
        copyOnWriteList.add("Element 2");

        // 創(chuàng)建多個線程來并發(fā)地修改列表
        Runnable addTask = () -> {
            copyOnWriteList.add("New Element");
            System.out.println("Added element by thread: " + Thread.currentThread().getName());
        };

        Thread thread1 = new Thread(addTask);
        Thread thread2 = new Thread(addTask);

        thread1.start();
        thread2.start();

        // 等待線程執(zhí)行完成
        try {
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 打印最終的 copyOnWriteList
        System.out.println("Final copyOnWriteList: " + copyOnWriteList);
    }
}

????????是一種特定的并發(fā)控制技術(shù),它在讀操作時不加鎖,只有在寫操作時才會加鎖。

? ? ? ? 3.0 多線程環(huán)境使用隊列

? ? ? ? 1)基于數(shù)值實現(xiàn)的阻塞隊列:ArrayBlockingQueue

? ? ? ? 2)基于鏈表實現(xiàn)的阻塞隊列:LinkedBlockingQueue

? ? ? ? 3)基于優(yōu)先級隊列實現(xiàn)的阻塞隊列:PriorityBlockingQueue

? ? ? ? 4)最多只包含一個元素的阻塞隊列:TransferQueue

以 LinkedBlockingQueue 舉個例子:

import java.util.concurrent.LinkedBlockingQueue;

public class LinkedBlockingQueueExample {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<>();

        // 創(chuàng)建生產(chǎn)者線程
        Runnable producer = () -> {
            try {
                for (int i = 0; i < 5; i++) {
                    String element = "Element " + i;
                    queue.put(element);
                    System.out.println("Produced: " + element);
                    Thread.sleep(1000); // 模擬生產(chǎn)過程
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        };

        // 創(chuàng)建消費(fèi)者線程
        Runnable consumer = () -> {
            try {
                while (true) {
                    String element = queue.take();
                    System.out.println("Consumed: " + element);
                    Thread.sleep(1500); // 模擬消費(fèi)過程
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        };

        // 啟動生產(chǎn)者和消費(fèi)者線程
        Thread producerThread = new Thread(producer);
        Thread consumerThread = new Thread(consumer);

        producerThread.start();
        consumerThread.start();
    }
}

????????LinkedBlockingQueue 實例 queue,然后分別創(chuàng)建了生產(chǎn)者線程和消費(fèi)者線程。生產(chǎn)者線程不斷向隊列中生產(chǎn)元素,消費(fèi)者線程則從隊列中消費(fèi)元素,實現(xiàn)了生產(chǎn)者和消費(fèi)者之間的協(xié)作。

? ? ? ? 4.0 多線程環(huán)境使用哈希表

? ? ? ? HashMap 本身不是線程安全的。

? ? ? ? 在多線程環(huán)境下使用哈希表可用使用:HashTable 、ConcurrentHashMap

????????4.1 HashTable 類

? ? ? ? 現(xiàn)在雖然已經(jīng)有了 HashTable 類實現(xiàn)了線程安全了,只是簡單的把關(guān)鍵方法加上了 synchronized 關(guān)鍵字而已。一個 HashTable 只有一把鎖,兩個線程訪問 HashTable 中的任意數(shù)據(jù)都會出現(xiàn)鎖競爭。

? ? ? ? 1)如果多線程訪問同一個 HashTable 就會直接造成鎖沖突。

? ? ? ? 2)size 屬性也是通過 synchronized 來控制同步,也是比較慢的。

? ? ? ? 3)一旦觸發(fā)擴(kuò)容,就由該線程完成整個擴(kuò)容過程,這個過程會涉及到大量的元素拷貝,效率會非常低。

? ? ? ? 4.2 ConcurrentHashMap 類

? ? ? ? 相比于 HashTable 做出了一系列的改進(jìn)和優(yōu)化。

? ? ? ? ConcurrentHashMap 每個哈希桶都有一把鎖,只有兩個線程訪問的恰好是同一個哈希桶上的數(shù)據(jù)才出現(xiàn)鎖沖突。但是這個概率很低,所以鎖沖突也很小,鎖競爭小。

? ? ? ? 1)讀操作沒有加鎖,但是使用了 Volatile 保證從內(nèi)存讀取結(jié)果。只對寫操作進(jìn)行加鎖,加鎖的方式仍然是 synchronized ,但是不是鎖整個對象,而是“鎖桶”,每一個鏈表的頭節(jié)點作為鎖對象,大大降低了鎖沖突的概率。由于哈希表是由數(shù)組與鏈表或者紅黑樹組成的,數(shù)組的長度很長,因此相對鏈表的長度來說,鏈表的長度就很短了,所以在多線程中,對數(shù)組中的某一個鏈表大概率是不會沖突的,因此即使每一個鏈表都上鎖了,這個鎖也大概率是偏向鎖,大概率是沒有加鎖和解鎖的開銷。

? ? ? ? 2)充分利用 CAS 特性,比如 size 屬性通過 CAS 來更新,避免出現(xiàn)重量級鎖的情況。

? ? ? ? 3)優(yōu)化了擴(kuò)容方式:化整為零

? ? ? ? 發(fā)現(xiàn)需要擴(kuò)容的線程,只需要創(chuàng)建一個新的數(shù)組,同時只搬幾個元素過去。擴(kuò)容期間,新老數(shù)組同時存在。后續(xù)每一個來操作 ConcurrentHashMap 的線程,都會參與搬家的過程,每個操作負(fù)責(zé)搬運(yùn)一小部分元素。這個期間,插入只往新數(shù)組加,查詢需要同時新舊數(shù)組。

? ? ? ? 搬完最后一個元素再把舊數(shù)組刪掉。

java保存線程的集合,JavaEE 初級篇,java,jvm,開發(fā)語言,java-ee,安全,大數(shù)據(jù)文章來源地址http://www.zghlxwxcb.cn/news/detail-857606.html

到了這里,關(guān)于JavaEE 初階篇-線程安全的集合類、多線程環(huán)境使用 ArrayList、隊列、哈希表(HashMap 、ConCurrentHashMap 、HashTable 的區(qū)別)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • JavaEE 初階篇-深入了解進(jìn)程與線程(常見的面試題:進(jìn)程與線程的區(qū)別)

    JavaEE 初階篇-深入了解進(jìn)程與線程(常見的面試題:進(jìn)程與線程的區(qū)別)

    ??博客主頁:?【 小扳_-CSDN博客】 ?感謝大家點贊??收藏?評論? 文章目錄 ? ? ? ? 1.0 進(jìn)程概述 ? ? ? ? 2.0 線程概述 ? ? ? ? 2.1 多線程概述 ? ? ? ? 3.0 常見的面試題:談?wù)勥M(jìn)程與線程的區(qū)別 ? ? ? ? 4.0 Java 實現(xiàn)多線程的常見方法 ? ? ? ? 4.1 實現(xiàn)多線程方法 - 繼承

    2024年04月13日
    瀏覽(33)
  • javaEE初階——多線程(九)——JUC常見的類以及線程安全的集合類

    javaEE初階——多線程(九)——JUC常見的類以及線程安全的集合類

    T04BF ??專欄: 算法|JAVA|MySQL|C語言 ?? 小比特 大夢想 此篇文章與大家分享多線程專題的最后一篇文章:關(guān)于JUC常見的類以及線程安全的集合類 如果有不足的或者錯誤的請您指出! 3.1Callable接口 Callable和Runnable一樣,都是用來描述一個任務(wù)的 但是區(qū)別在于 ,用Callable描述的任務(wù)是有

    2024年04月25日
    瀏覽(21)
  • 【JavaEE初階】 線程安全

    【JavaEE初階】 線程安全

    線程安全是多線程編程是的計算機(jī)程序代碼中的一個概念。在擁有共享數(shù)據(jù)的多條線程并行執(zhí)行的程序中,線程安全的代碼會通過同步機(jī)制保證各個線程都可以正常且準(zhǔn)確的執(zhí)行,不會出現(xiàn)數(shù)據(jù)污染等意外情況。上述是百度百科給出的一個概念解釋。換言之,線程安全就是某

    2024年02月08日
    瀏覽(24)
  • 【JavaEE】線程安全的集合類

    【JavaEE】線程安全的集合類

    作者主頁:paper jie_博客 本文作者:大家好,我是paper jie,感謝你閱讀本文,歡迎一建三連哦。 本文于《JavaEE》專欄,本專欄是針對于大學(xué)生,編程小白精心打造的。筆者用重金(時間和精力)打造,將基礎(chǔ)知識一網(wǎng)打盡,希望可以幫到讀者們哦。 其他專欄:《MySQL》《C語言》

    2024年01月20日
    瀏覽(28)
  • JavaEE 初階篇-深入了解單例模式(經(jīng)典單例模式:餓漢模式、懶漢模式)

    JavaEE 初階篇-深入了解單例模式(經(jīng)典單例模式:餓漢模式、懶漢模式)

    ??博客主頁:?【 小扳_-CSDN博客】 ?感謝大家點贊??收藏?評論? 文章目錄 ? ? ? ? 1.0 單例模式的概述 ? ? ? ? 2.0 單例模式 - 餓漢式單例 ? ? ? ? 2.1 關(guān)于餓漢式單例的線程安全問題 ? ? ? ? 3.0 單例模式 - 懶漢式單例 ? ? ? ? 3.1 關(guān)于懶漢式單例的線程安全問題 ? ? ?

    2024年04月15日
    瀏覽(28)
  • JavaEE 初階篇-深入了解 UDP 通信與 TCP 通信(綜合案例:實現(xiàn) TCP 通信群聊)

    JavaEE 初階篇-深入了解 UDP 通信與 TCP 通信(綜合案例:實現(xiàn) TCP 通信群聊)

    ??博客主頁:?【 小扳_-CSDN博客】 ?感謝大家點贊??收藏?評論? 文章目錄 ? ? ? ? 1.0 UDP 通信 ????????1.1 DatagramSocket 類 ????????1.2 DatagramPacket 類 ????????1.3 實現(xiàn) UDP 通信(一發(fā)一收) ? ? ? ? 1.3.1 客戶端的開發(fā) ? ? ? ? 1.3.2 服務(wù)端的開發(fā) ????????1.4 實

    2024年04月26日
    瀏覽(21)
  • JavaEE 初階篇-深入了解 I/O 高級流(緩沖流、交換流、數(shù)據(jù)流和序列化流)

    JavaEE 初階篇-深入了解 I/O 高級流(緩沖流、交換流、數(shù)據(jù)流和序列化流)

    ??博客主頁:?【 小扳_-CSDN博客】 ?感謝大家點贊??收藏?評論? 文章目錄 ? ? ? ? 1.0 緩沖流概述 ? ? ? ? 1.1 緩沖流的工作原理 ? ? ? ? 1.2 使用緩沖流的步驟 ? ? ? ? 1.3?字節(jié)緩沖流于字符緩沖流的區(qū)別 ? ? ? ? 1.4?字節(jié)緩沖流的實例 ? ? ? ? 1.5?字符緩沖流的實例

    2024年04月29日
    瀏覽(20)
  • 【JavaEE】JUC(java.util.concurrent)的常見類以及線程安全的集合類

    【JavaEE】JUC(java.util.concurrent)的常見類以及線程安全的集合類

    目錄 1、JUC(java.util.concurrent)的常見類 1.1、Callable接口的用法(創(chuàng)建線程的一種寫法) ?1.2、ReentrantLock可重入互斥鎖 1.2.1、ReentrantLock和synchronized的區(qū)別? 1.2.2、如何選擇使用哪個鎖 1.3、Semaphore信號量 1.4、CountDownLatch ?2、線程安全的集合類 2.1、多線程環(huán)境使用ArrayList ?2.2、

    2024年02月07日
    瀏覽(32)
  • JavaEE初階:多線程 - 編程

    JavaEE初階:多線程 - 編程

    我們在之前認(rèn)識了什么是多進(jìn)程,今天我們來了解線程。 一個線程就是一個 \\\"執(zhí)行流\\\". 每個線程之間都可以按照順訊執(zhí)行自己的代碼. 多個線程之間 \\\"同時\\\" 執(zhí)行 著多份代碼. 引入 進(jìn)程 這個概念,主要是為了解決并發(fā)編程這樣的問題。因為cpu進(jìn)入了多核心的時代,要想進(jìn)一步

    2024年02月12日
    瀏覽(20)
  • javaee初階———多線程(三)

    javaee初階———多線程(三)

    T04BF ??專欄: 算法|JAVA|MySQL|C語言 ?? 小比特 大夢想 此篇文章與大家分享多線程專題第三篇,關(guān)于 線程安全 方面的內(nèi)容 如果有不足的或者錯誤的請您指出! 我們在前面說過,線程之間是搶占式執(zhí)行的,這樣產(chǎn)生的隨機(jī)性,使得程序的執(zhí)行順序變得不一致,就會使得程序產(chǎn)生不同的結(jié)

    2024年04月16日
    瀏覽(36)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包