簡體   English   中英

從陣列同時讀取是否是線程安全的?

[英]Are simultaneous reads from an array thread-safe?

我有一個數組,其中包含聲明如下的整數值:

int data[] = new int[n];

每個值都需要處理,我將工作分成幾部分,以便它可以由不同的線程處理。 處理期間不會修改數組。

所有處理線程可以同時讀取數組的不同部分嗎? 或者我必須使用鎖?

換句話說:這個工單是否是線程安全的?

Array is created and filled
Threads are created and started
Thread 0 reads data[0..3]
Thread 1 reads data[4..7]
Thread 2 reads data[8..n]

通過多個線程讀取數組(或任何其他集合,對象的字段等)的內容是線程安全的,前提是在此期間不修改數據。

如果用數據填充數組進行處理並將其傳遞給不同的線程進行讀取,那么將正確讀取數據並且不會有數據爭用。

請注意, 這只有在填充數組后創建線程時才有效 如果將數組傳遞給某些已存在的線程而沒有同步,則可能無法正確讀取數組的內容。 在這種情況下,線程獲得對數組的引用的方法應該是同步的,因為同步塊強制線程之間的內存更新。

旁注:使用不可變集合可能是個好主意。 這樣你就不會有任何修改。 我建議使用這樣的包裝器。 檢查java.util.concurrent.atomic包,應該有一些你可以使用的東西。

只要線程不修改數組中的內容,就可以從多個線程中讀取數組。

如果確保所有線程都只是讀取,則其線程安全。 雖然你不應該單獨依賴這個事實alone並試圖通過包裝器使你的數組​​不可變。

當然,如果您只想閱讀它,請在創建時將數組傳遞給線程。 只要您不修改它就不會有任何問題。

從數組數組中讀取是線程安全操作,但如果您要修改數組而不是考慮使用類AtomicIntegerArray

考慮填充ConcurrendLinkedQueue並讓每個線程從中拉出。 這將確保不存在並發問題。

您的每個線程都會從隊列頂部提取數據並進行處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM