亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

在Java中實(shí)現(xiàn)線程之間的數(shù)據(jù)共享的幾種方式總結(jié)

 更新時(shí)間:2025年08月03日 14:26:19   作者:csdn_tom_168  
在 Java 中實(shí)現(xiàn)線程間數(shù)據(jù)共享是并發(fā)編程的核心需求,但需要謹(jǐn)慎處理同步問題以避免競(jìng)態(tài)條件,本文通過代碼示例給大家介紹了幾種主要實(shí)現(xiàn)方式及其最佳實(shí)踐,需要的朋友可以參考下

在 Java 中實(shí)現(xiàn)線程間數(shù)據(jù)共享是并發(fā)編程的核心需求,但需要謹(jǐn)慎處理同步問題以避免競(jìng)態(tài)條件。以下是幾種主要實(shí)現(xiàn)方式及其最佳實(shí)踐:

1. 共享變量與同步機(jī)制

通過鎖控制對(duì)共享對(duì)象的訪問,避免競(jìng)態(tài)條件。

  • synchronized 關(guān)鍵字

修飾方法或代碼塊,確保同一時(shí)間僅一個(gè)線程訪問資源:

public class Counter {
    private int count = 0;
    public synchronized void increment() { count++; }  // 同步方法
    public int getCount() { return count; }
}

適用場(chǎng)景:簡(jiǎn)單計(jì)數(shù)器或低并發(fā)場(chǎng)景。

  • ReentrantLock

提供更靈活的鎖控制(如超時(shí)、公平鎖):

private ReentrantLock lock = new ReentrantLock();
public void update() {
    lock.lock();
    try { /* 修改共享數(shù)據(jù) */ } 
    finally { lock.unlock(); }
}

適用場(chǎng)景:需細(xì)粒度鎖控制的復(fù)雜同步邏輯。

2. 輕量級(jí)通信機(jī)制

適用于狀態(tài)標(biāo)志或簡(jiǎn)單原子操作。

  • volatile 關(guān)鍵字

保證變量可見性(不保證原子性):

public class StatusChecker {
    private volatile boolean isRunning = true;  // 線程可見
    public void stop() { isRunning = false; }
}

適用場(chǎng)景:?jiǎn)螌懚嘧x的狀態(tài)標(biāo)志(如停止信號(hào))。

  • 原子類(AtomicInteger等)

基于CAS實(shí)現(xiàn)無(wú)鎖線程安全:

private AtomicInteger counter = new AtomicInteger(0);
public void safeIncrement() {
    counter.incrementAndGet();  // 原子操作
}

適用場(chǎng)景:計(jì)數(shù)器、狀態(tài)位等高頻讀寫操作。

3. 線程安全容器

直接使用并發(fā)集合避免手動(dòng)同步:

  • ConcurrentHashMap:分段鎖實(shí)現(xiàn)高并發(fā)讀寫。
  • CopyOnWriteArrayList:寫時(shí)復(fù)制,適合讀多寫少場(chǎng)景。
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.put("key", 100);  // 線程安全

4. 線程局部變量(ThreadLocal)

為每個(gè)線程創(chuàng)建獨(dú)立數(shù)據(jù)副本,避免共享:

private static ThreadLocal<Integer> threadLocal = ThreadLocal.withInitial(() -> 0);
public void setValue(int val) { threadLocal.set(val); }  // 僅當(dāng)前線程可見

適用場(chǎng)景:線程上下文信息(如用戶會(huì)話、事務(wù)ID)。

5. 高級(jí)協(xié)調(diào)機(jī)制

通過工具類實(shí)現(xiàn)線程協(xié)作:

BlockingQueue:生產(chǎn)者-消費(fèi)者模型的核心工具。

BlockingQueue<String> queue = new ArrayBlockingQueue<>(10);
// 生產(chǎn)者
queue.put("data");  // 隊(duì)列滿時(shí)阻塞
// 消費(fèi)者
String data = queue.take();  // 隊(duì)列空時(shí)阻塞

適用場(chǎng)景:任務(wù)調(diào)度、異步處理。

  • CountDownLatch:主線程等待子線程完成。
  • CyclicBarrier:多線程相互等待至屏障點(diǎn)。

6. 生產(chǎn)者-消費(fèi)者模式(wait()/notify())

通過共享對(duì)象的等待/喚醒機(jī)制同步:

public synchronized void produce() throws InterruptedException {
    while (isFull) wait();  // 釋放鎖并等待
    produceData();
    notifyAll();  // 喚醒消費(fèi)者
}

注意事項(xiàng):需在同步塊內(nèi)調(diào)用,避免虛假喚醒。

技術(shù)選型建議

場(chǎng)景推薦方案優(yōu)勢(shì)
高頻計(jì)數(shù)器原子類(AtomicInteger)無(wú)鎖、高性能
復(fù)雜同步邏輯ReentrantLock + Condition支持多條件隊(duì)列
讀多寫少的集合CopyOnWriteArrayList讀操作無(wú)鎖
任務(wù)調(diào)度BlockingQueue內(nèi)置阻塞機(jī)制
線程隔離數(shù)據(jù)(如用戶會(huì)話)ThreadLocal避免同步開銷

關(guān)鍵原則

  • 避免鎖嵌套:防止死鎖(按固定順序獲取鎖)。
  • 性能權(quán)衡:同步代碼塊 > 同步方法(減少鎖范圍)。
  • 可見性保障:多線程寫操作必須同步(volatile僅解決可見性)。

通過綜合運(yùn)用上述技術(shù),可平衡線程安全、性能與代碼簡(jiǎn)潔性。實(shí)際開發(fā)中優(yōu)先考慮java.util.concurrent工具類,其內(nèi)部?jī)?yōu)化顯著降低手動(dòng)同步風(fēng)險(xiǎn)。

以上就是在Java中實(shí)現(xiàn)線程之間的數(shù)據(jù)共享的幾種方式總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于Java線程間數(shù)據(jù)共享的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • springboot配置Jackson返回統(tǒng)一默認(rèn)值的實(shí)現(xiàn)示例

    springboot配置Jackson返回統(tǒng)一默認(rèn)值的實(shí)現(xiàn)示例

    在項(xiàng)目開發(fā)中,我們返回的數(shù)據(jù)或者對(duì)象沒有的時(shí)候一般直接返回的null,那么如何返回統(tǒng)一默認(rèn)值,感興趣的可以了解一下
    2021-07-07
  • 詳解Spring Security的formLogin登錄認(rèn)證模式

    詳解Spring Security的formLogin登錄認(rèn)證模式

    對(duì)于一個(gè)完整的應(yīng)用系統(tǒng),與登錄驗(yàn)證相關(guān)的頁(yè)面都是高度定制化的,非常美觀而且提供多種登錄方式。這就需要Spring Security支持我們自己定制登錄頁(yè)面,也就是本文給大家介紹的formLogin模式登錄認(rèn)證模式,感興趣的朋友跟隨小編一起看看吧
    2019-11-11
  • 調(diào)用java.lang.Runtime.exec的正確姿勢(shì)分享

    調(diào)用java.lang.Runtime.exec的正確姿勢(shì)分享

    這篇文章主要介紹了調(diào)用java.lang.Runtime.exec的正確姿勢(shì),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • SpringMVC異步處理的 5 種方式示例詳解

    SpringMVC異步處理的 5 種方式示例詳解

    這篇文章主要介紹了SpringMVC異步處理的 5 種方式,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • idea與eclipse項(xiàng)目相互導(dǎo)入的過程(圖文教程)

    idea與eclipse項(xiàng)目相互導(dǎo)入的過程(圖文教程)

    這篇文章主要介紹了idea與eclipse項(xiàng)目相互導(dǎo)入的過程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • MyBatis中常見的SQL執(zhí)行方式及其使用方法

    MyBatis中常見的SQL執(zhí)行方式及其使用方法

    MyBatis可能很多人都一直在用,但是MyBatis的SQL執(zhí)行流程可能并不是所有人都清楚了,下面這篇文章主要給大家介紹了關(guān)于MyBatis中常見的SQL執(zhí)行方式及其使用的相關(guān)資料,需要的朋友可以參考下
    2023-09-09
  • Monaco?Editor實(shí)現(xiàn)sql和java代碼提示實(shí)現(xiàn)示例

    Monaco?Editor實(shí)現(xiàn)sql和java代碼提示實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了Monaco?Editor代碼提示sql和java實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • SpringBoot實(shí)現(xiàn)熱部署Community的示例代碼

    SpringBoot實(shí)現(xiàn)熱部署Community的示例代碼

    本文主要介紹了SpringBoot實(shí)現(xiàn)熱部署Community的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Java合并PDF文檔的三種常用方式總結(jié)

    Java合并PDF文檔的三種常用方式總結(jié)

    這篇文章主要給大家介紹了關(guān)于Java合并PDF文檔的三種常用方式,文中介紹的方式分別是Apache?PDFBox、Spire.PDF(IceBlue)和iText?PDF,每種方式都有其對(duì)應(yīng)的pom.xml代碼示例,,要的朋友可以參考下
    2024-12-12
  • SpringBoot 集成 Druid過程解析

    SpringBoot 集成 Druid過程解析

    這篇文章主要介紹了SpringBoot 集成 Druid過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09

最新評(píng)論