第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

多個(gè)線程訪問的地圖上的準(zhǔn)確數(shù)據(jù)

多個(gè)線程訪問的地圖上的準(zhǔn)確數(shù)據(jù)

繁華開滿天機(jī) 2021-08-25 15:31:48
我試圖根據(jù)實(shí)例化時(shí)賦予它們的權(quán)重將對(duì)象分為五個(gè)單獨(dú)的組?,F(xiàn)在,我想根據(jù)它們的權(quán)重將這些對(duì)象分為五組。為了做到這一點(diǎn),必須將每一個(gè)都與另一個(gè)進(jìn)行比較。現(xiàn)在我遇到的問題是這些對(duì)象被添加到單獨(dú)的工作線程上的組中。在對(duì)象完成下載圖片后,每個(gè)都被發(fā)送到同步排序功能,該功能與當(dāng)前在三個(gè)組中的所有成員進(jìn)行比較。這些組已被設(shè)置為兩個(gè)不同的地圖。第一個(gè)是 Hashtable,它會(huì)導(dǎo)致程序崩潰并拋出未知的 ConcurrencyIssue。當(dāng)我使用 ConcurrentHashMap 時(shí),數(shù)據(jù)是錯(cuò)誤的,因?yàn)樗谙乱粋€(gè)對(duì)象與 ConcurrentHashmap 進(jìn)行比較之前沒有及時(shí)刪除條目。因此,這會(huì)導(dǎo)致邏輯錯(cuò)誤并產(chǎn)生僅在一半時(shí)間內(nèi)正確排序的組。我需要哈希圖在下一次排序發(fā)生之前立即從地圖中刪除條目......我認(rèn)為同步函數(shù)可以做到這一點(diǎn),但它似乎仍然不起作用。是否有更好的方法來對(duì)由工作線程添加到數(shù)據(jù)結(jié)構(gòu)中的對(duì)象進(jìn)行排序?謝謝!我對(duì)這個(gè)有點(diǎn)迷茫。private synchronized void sortingHat(Moment moment) {    try {        ConcurrentHashMap[] helperList = {postedOverlays, chanl_2, chanl_3, chanl_4, chanl_5};        Moment moment1 = moment;        //Iterate over all channels going from highest channel to lowest        for (int i = channelCount - 1; i > 0; i--) {            ConcurrentHashMap<String, Moment> table = helperList[i];            Set<String> keys = table.keySet();            boolean mOverlap = false;            double width = getWidthbyChannel(i);            //If there is no objects in table, don't bother trying to compare...            if (!table.isEmpty()) {                //Iterate over all objects currently in the hashmap                for (String objId : keys) {                    Moment moment2 = table.get(objId);                    //x-Overlap                    if ((moment2.x + width >= moment1.x - width) ||                            (moment2.x - width <= moment1.x + width)) {                        //y-Overlap                                                   if ((moment2.y + width >= moment1.y - width) ||                                (moment2.y - width <= moment1.y + width)) {                            }                        }                    }                }            }這table.remove(objId)就是問題發(fā)生的地方。時(shí)刻 A 被發(fā)送到排序功能,并且沒有問題。添加時(shí)刻 B,它重疊,與時(shí)刻 A 進(jìn)行比較。如果時(shí)刻 B 的權(quán)重小于時(shí)刻 A,則一切正常。如果時(shí)刻 B 的權(quán)重更大并且 A 必須被移除,那么當(dāng)時(shí)刻 C 被排序時(shí),時(shí)刻 A 仍將與時(shí)刻 B 一起出現(xiàn)在哈希圖中。 所以這似乎是邏輯錯(cuò)誤所在。
查看完整描述

1 回答

?
慕后森

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊

您的同步有問題。


您使用的同步將使用“this”鎖進(jìn)行同步。你可以這樣想象:


public synchronized void foo() { ... }

是相同的


public void foo() {

    synchronized(this) {

        ....

    }

}

這意味著,在進(jìn)入之前,當(dāng)前 Thread 將嘗試獲取“這個(gè)對(duì)象”作為鎖。現(xiàn)在,如果你有一個(gè)工作線程,它也有一個(gè)同步方法(用于向表中添加內(nèi)容),它們不會(huì)完全相互排斥。你想要的是,在下一個(gè)線程開始工作之前,一個(gè)線程必須完成他的工作。


第一個(gè)是 Hashtable,它會(huì)導(dǎo)致程序崩潰并拋出未知的 ConcurrencyIssue。


之所以會(huì)出現(xiàn)這個(gè)問題,是因?yàn)樗赡軙?huì)發(fā)生,即 2 個(gè)線程同時(shí)調(diào)用某些東西。為了說明這一點(diǎn),想象一個(gè)線程對(duì)其調(diào)用 put(key, value) 和另一個(gè)線程調(diào)用 remove(key)。如果這些調(diào)用同時(shí)執(zhí)行(例如由不同的內(nèi)核執(zhí)行),那么生成的 HashTable 會(huì)是什么?因?yàn)闆]有人可以肯定,所以會(huì)拋出ConcurrentModificationException。注意:這是一個(gè)非常簡單的解釋!


當(dāng)我使用 ConcurrentHashMap 時(shí),數(shù)據(jù)是錯(cuò)誤的,因?yàn)樗鼪]有在下一個(gè)對(duì)象與 ConcurrentHashmap 進(jìn)行比較之前及時(shí)刪除條目


ConcurrentHashMap 是一個(gè)實(shí)用程序,為了避免并發(fā)問題,它不是神奇的,多功能的,獨(dú)角獸狩獵,黃油刀。它同步了 mehtod 調(diào)用,這導(dǎo)致只有一個(gè)線程可以在 HashMap 上添加或刪除或執(zhí)行任何其他工作。它不具有與某種鎖相同的功能,這將導(dǎo)致對(duì)分配給線程的映射的訪問。


可能有一個(gè)想要調(diào)用 add 的線程和一個(gè)想要調(diào)用 remove 的線程。ConcurrentHashMap 僅限制了這些調(diào)用,它們不能同時(shí)發(fā)生。哪個(gè)先來?你有權(quán)力(在這種情況下)。你想要的是,一個(gè)線程必須完成他的工作,然后下一個(gè)線程才能完成它的工作。


你真正需要什么取決于你。在java.util.concurrent包帶來的,你可以使用類整體阿森納。例如:


您可以為每個(gè) Map使用一個(gè)鎖。有了這個(gè),每個(gè)線程(排序/刪除/添加或其他)可以首先獲取所述 Map 的鎖,然后在該 Map 上工作,如下所示:


public Worker implements Runnable {

    private int idOfMap = ...;

    @Override

    public void run() {

        Lock lock = getLock(idOfMap);

        try {

            lock.lock();

            // The work goes here

            //...

        } finally {

            lock.unlock();

        }

    }

}

行 lock.lock() 將確保在方法調(diào)用返回后沒有其他線程正在處理 Map 并修改它,因此該線程將具有對(duì) Map 的雙向訪問權(quán)。在您完成刪除正確的元素之前,沒有一種排序。


當(dāng)然,您必須以某種方式持有所述鎖,就像在數(shù)據(jù)對(duì)象中一樣。話雖如此,您還可以在每個(gè)線程中使用信號(hào)量、synchronized(map) 或以 Runnables 的形式在 Map 上制定您的工作,并將它們傳遞給另一個(gè)線程,該線程一個(gè)接一個(gè)地調(diào)用他收到的所有 Runnables。可能性幾乎是無限的。我個(gè)人建議從鎖定開始。


查看完整回答
反對(duì) 回復(fù) 2021-08-25
  • 1 回答
  • 0 關(guān)注
  • 172 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)