簡體   English   中英

arraylist / atomic double array(Google Guava)中的.get()操作是線程安全的嗎?

[英]is .get() operation in arraylist/atomic double array (Google Guava) thread-safe?

以下是我的Java代碼中的主要操作之一:

 AtomicDoubleArray array1 = new AtomicDoubleArray(25);

 for(int i =0 ; i< array1.size(); i++){
     double a = array1.get(i)*0.001;
     double b = a+ array1.get(i);
     array1.set(b);
 }

上面的代碼是線程安全的嗎? 如果我不能使上面的代碼線程安全嗎?我想在讀取元素時不要保持鎖定,而是在設置每個組件的值時保持鎖定,這意味着許多線程可以設置array1的不同組件。

上面的代碼是線程安全的嗎?

這取決於您對線程安全的含義。 每個單獨的get()和set()操作都應該是線程安全的,但是多個線程可以同時調用此方法,因此可以在第一個線程完成迭代之前由第二個線程重新分配單獨的數組條目。 除了在公共對象(可以是數組或其他專用鎖對象)上進行同步之外,您無能為力。

我不想在讀取元素時保持鎖定,而是在設置每個組件的值時保持鎖定,這意味着許多線程可以設置array1的不同組件。

如果我了解這項權利,則除了以下部分外,您可以按原樣使用代碼,而無需進行其他鎖定(請參見上文):

 array1.set(b);

需要閱讀:

 array1.set(i, b);

在對array1.get(i)的兩個連續調用中,您可能會獲得不同的值。 如果要避免同步,請查看寫入數據結構上的副本(例如,CopyOnWriteArrayList- http ://docs.oracle.com/javase/6/docs/api/java/util/concurrent/CopyOnWriteArrayList.html)

暫無
暫無

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

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