[英]concurrent updates on an array in java
在java中,我有一大堆字符串。
我有一個線程做這樣的事情:
for (int i=0;i<10000;i++) array[i] = getSomeValue();
我有另一個線程做這樣的事情:
for (int i=10000;i<20000;i++) array[i] = getSomeValue();
和另一個線程:
for (int i=20000;i<30000;i++) array[i] = getSomeValue();
等等。
我必須做一些特別的事情來做這個操作嗎?
它會起作用嗎?
我試圖通過將任務分成多個線程來更快地填充這個大型數組,但我想知道這是否正確。
我正在使用64位機器16 cpu和所有花哨的東西。
這應該工作正常。 但是,如果您想確保它是安全的,您可以在每個線程中填充不同的數組,然后將System.arraycopy()填充到一個大數組中。
您可以使用此代碼安全地初始化數組,但是之后需要使用該數組的任何代碼都需要與正在執行初始更新的線程正確同步。 這可以像在使用數組之前“加入”所有init線程一樣簡單。
使用Java 8,這變得更加容易:
Arrays.parallelSetAll(array, i -> getSomeValue());
這也應解決其他答案和評論中提到的可見性問題。
除非getSomeValue()
具有改變多線程訪問的可變狀態的副作用,否則應該getSomeValue()
。 如果它沒有任何狀態更改,那么您已設置。 您不會在任何循環中訪問相同的內存位。
它是否真的更快取決於您的硬件設置和線程實現。
只要每個線程在數組的特定段上工作,那么更新應該沒問題。 另外,你可以通過划分工作來獲得性能提升。 您可能希望通過使用不同數量的線程進行測試來測試增強級別。 可能應該從16開始,因為你有16個CPU,並看看如何增加和減少影響性能。
您可能遇到的一個問題是可見性。 我不相信所有線程都能保證數組的元素可見,因為它們不是易失性的。 因此,如果需要多個線程訪問數組的各個部分,那么您可能會遇到問題。 處理此問題的一種方法是使用AtomicIntegerArray ... AtomicReferenceArray。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.