簡體   English   中英

如果多個線程正在更新同一個變量,應該做什么,以便每個線程正確更新變量?

[英]if multiple threads are updating the same variable, what should be done so each thread updates the variable correctly?

如果多個線程正在更新同一個變量,我該怎么做才能讓每個線程正確更新變量?

任何幫助將不勝感激

有幾種選擇:

1) 根本不使用同步

這只能在數據是基本類型(不是長/雙)的情況下工作,並且您不關心讀取陳舊值(這不太可能)

2) 將該字段聲明為volatile

這將保證永遠不會讀取陳舊的值。 它也適用於對象(假設對象在創建后沒有更改),因為事先發生了對volatile變量的保證(參見“Java Memory Model”)。

3) 使用java.util.concurrent.AtomicLong,AtomicInteger等

它們都是線程安全的,並支持特殊操作,如原子增量和原子比較和設置操作。

4) 使用相同的鎖保護讀寫

此方法提供了互斥,允許定義大型原子操作,其中多個數據成員作為單個操作進行操作。

這是多線程應用程序的一個主要問題,並且在答案中涵蓋的內容超出了我的實際范圍,所以我會指出一些資源。

http://download.oracle.com/javase/tutorial/essential/concurrency/sync.html

http://www.vogella.de/articles/JavaConcurrency/article.html#concurrencyjava_synchronized

實質上,您使用synchronized關鍵字來鎖定變量。 這可以確保一段代碼一次只運行一次。 您還可以在多個區域中的同一對象周圍放置鎖。

此外,您需要注意幾個陷阱,例如死鎖。

http://tutorials.jenkov.com/java-concurrency/deadlock.html

錯誤使用鎖導致的錯誤通常很難調試和追蹤,因為它們不是很一致。 因此,您始終需要小心將所有鎖放在正確的位置。

您應該對有問題的變量實現鎖定。 例如。

http://download.oracle.com/javase/tutorial/essential/concurrency/newlocks.html

暫無
暫無

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

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