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

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

并發(fā)和并發(fā)數(shù)據(jù)結(jié)構(gòu)

并發(fā)和并發(fā)數(shù)據(jù)結(jié)構(gòu)

人到中年有點(diǎn)甜 2021-08-06 10:06:40
我正在練習(xí)一點(diǎn)并發(fā)。public class WordOccurrencesBigFile {    private String words;    private ConcurrentHashMap<String, Pair<String, Integer>> wordOccurrencesMap = new ConcurrentHashMap<>();    public WordOccurrencesBigFile(String wordsLine) {        this.words = wordsLine;    }    public void processWords() {        parseWordsLines();        printOrderAlphabetically();        printOrderByCount();        printByInsertionOrder();    }    private void parseWordsLines() {        String[] wordsLinesArray = words.split("\n");        ExecutorService executor = Executors.newFixedThreadPool(5);        for(String wordsLine: wordsLinesArray) {            executor.execute(() -> parseWords(wordsLine));        }        executor.shutdown();        while (!executor.isTerminated()) {        }        System.out.println("Finished all threads");    }    private void parseWords(String wordsLine) {        System.out.println(Thread.currentThread().getName() + " Start.");        System.out.println(Thread.currentThread().getName() + " Processing line: '" + wordsLine + "'");        String[] wordsArray = wordsLine.split(" ");}}在 parseWordsLines 上,使用 5 個(gè)線程池創(chuàng)建了一個(gè) ExecutorService,并且 WordOccurrencesBigFile 類使用由“\n”創(chuàng)建的多行字符串實(shí)例化。目的是讓每一行由不同的線程處理,并在 Map 上插入唯一單詞的計(jì)數(shù)。我期望通過使用 ConcurrentHashMap 足以處理我有多個(gè)線程讀取和寫入地圖的事實(shí)。但是在我執(zhí)行課程的大部分時(shí)間里,我得到了不同的計(jì)數(shù)。(奇怪的是主要是針對“bb”這個(gè)詞。但是添加了 synchronized(this) 問題就解決了。有人可以解釋為什么這種行為,解決這個(gè)問題的最佳方法,我應(yīng)該將“this”傳遞給同步塊或線程正在訪問的對象嗎?
查看完整描述

3 回答

?
慕后森

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

ConcurrentHashMap 是線程安全的,可以保證每一個(gè)操作都是線程安全的。


但是這些操作不是原子的:


            if (!wordOccurrencesMap.containsKey(word)) {

                pair = new Pair<>(word, 1);

                //System.out.println(Thread.currentThread().getName() + " Creating Pair: " + pair);

            } else {

                pair = wordOccurrencesMap.get(word);

                pair.setValue(pair.getValue() + 1);

                //System.out.println(Thread.currentThread().getName() + " Updating Pair: " + pair);

            }


            wordOccurrencesMap.put(word, pair);

您可以改為使用單個(gè)操作:


wordOccurrencesMap.compute(word,

        (s, pair) -> pair == null ?

                new Pair<>(word, 1) : pair.setValue(pair.getValue() + 1));


查看完整回答
反對 回復(fù) 2021-08-06
?
藍(lán)山帝景

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

好吧,添加可以synchronized(this)解決問題,但是您將失去多線程和并行化的所有好處。


你需要的是 的computeIfAbsent方法ConcurrentMap。所以你的for循環(huán)體將轉(zhuǎn)換為


Pair<String, Integer> pair = wordOccurrencesMap.computeIfAbsent(word, w -> new Pair<>(w, 0));

synchronized(pair) {

    pair.setValue(pair.getValue()+1);

}

現(xiàn)在你可以省略你的synchronized(this)塊。


編輯:但是您必須確保當(dāng)?shù)谝粋€(gè)線程調(diào)用pair.setValue() 時(shí),沒有另一個(gè)線程可以調(diào)用pair.getValue(),如注釋所述。


查看完整回答
反對 回復(fù) 2021-08-06
  • 3 回答
  • 0 關(guān)注
  • 188 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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