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

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

Java數(shù)組元素和內(nèi)存可見性問題

Java數(shù)組元素和內(nèi)存可見性問題

慕村9548890 2023-08-09 17:30:13
我已經(jīng)閱讀了一些關(guān)于來自多個線程的 Java 數(shù)組元素可見性的問題和答案,但我仍然無法真正理解某些情況。為了演示我遇到的問題,我提出了一個簡單的場景:假設(shè)我有一個簡單的集合,通過將元素散列到一個存儲桶中,將元素添加到其中一個存儲桶中(存儲桶就像某種列表) 。并且每個桶都是單獨同步的。例如:private final Object[] locks = new Object[10];private final Bucket[] buckets = new Bucket[10];這里有一個水桶i應(yīng)該由 來守護(hù)lock[i]。添加元素代碼如下所示:public void add(Object element) {        int bucketNum = calculateBucket(element); //hashes element into a bucket        synchronized (locks[bucketNum]) {            buckets[bucketNum].add(element);        }    }由于“桶”是最終的,因此即使沒有同步,也不會有任何可見性問題。我的猜測是,通過同步,如果沒有最終結(jié)果,也不會有任何可見性問題,這是正確的嗎?最后,有點棘手的部分。假設(shè)我想從任意線程復(fù)制并合并所有存儲桶的內(nèi)容并清空整個數(shù)據(jù)結(jié)構(gòu),如下所示:public List<Bucket> clear() {    List<Bucket> allBuckets = new List<>();    for(int bucketNum = 0; bucketNum < buckets.length; bucketNum++) {        synchronized (locks[bucketNum]) {            allBuckets.add(buckets[bucketNum]);            buckets[bucketNum] = new Bucket();        }        }    return allBuckets;}我基本上用新創(chuàng)建的存儲桶交換舊存儲桶,然后返回舊存儲桶。這種情況與前一種情況不同add(),因為我們沒有修改數(shù)組中引用引用的對象,而是直接更改數(shù)組/引用。請注意,當(dāng)我持有存儲桶 1 的鎖時,我不關(guān)心存儲桶 2 是否被修改,我不需要結(jié)構(gòu)完全同步和一致,只需可見性和接近一致性就足夠了。因此,假設(shè) everybucket[i]只在 下修改過lock[i],你會說這段代碼有效嗎?我希望能夠了解原因和原因,并更好地掌握可見性,謝謝。
查看完整描述

2 回答

?
慕后森

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

第一個問題。

locks在這種情況下,線程安全取決于對包含and buckets(我們稱之為)的對象的引用是否Container被正確共享。

試想一下:一個線程正忙于實例化一個新Container對象(分配內(nèi)存、實例化數(shù)組等),而另一個線程開始使用這個半實例化的對象,其中locksbuckets仍然為 null(它們還沒有被第一個線程實例化)。在這種情況下,這段代碼:

    synchronized (locks[bucketNum]) {

變得破碎并拋出NullPointerException。關(guān)鍵字final可以防止這種情況發(fā)生,并保證當(dāng)對的引用不為空時Container,其最終字段已被初始化:

當(dāng)對象的構(gòu)造函數(shù)完成時,該對象被認(rèn)為已完全初始化。僅在對象完全初始化后才能看到對該對象的引用的線程保證能看到該對象的最終字段的正確初始化值。( JLS 17.5 )

第二個問題。

假設(shè)locksbuckets字段是最終的,并且您不關(guān)心整個數(shù)組的一致性,并且“每個存儲桶 [i] 只在 lock[i] 下修改”,則此代碼很好。


查看完整回答
反對 回復(fù) 2023-08-09
?
森林海

TA貢獻(xiàn)2011條經(jīng)驗 獲得超2個贊

在你問的第一個問題中

由于“桶”是最終的,因此即使沒有同步,也不會有任何可見性問題。我的猜測是,通過同步,如果沒有最終結(jié)果,也不會有任何可見性問題,這是正確的嗎?

我不確定你所說的“可見性問題”是什么意思,但可以肯定的是,synchronized如果多個線程訪問buckets[i]其中一個線程并修改它(例如寫入它),那么如果沒有這段代碼,這段代碼將是不正確的。無法保證一個線程所寫入的內(nèi)容對另一線程可見。這還涉及存儲桶的內(nèi)部結(jié)構(gòu),可能會通過調(diào)用來修改add

請記住,finalonbuckets僅涉及對數(shù)組本身的單個引用,而不涉及其單元格。


查看完整回答
反對 回復(fù) 2023-08-09
  • 2 回答
  • 0 關(guān)注
  • 212 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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