簡體   English   中英

Java線程安全遞歸

[英]Java thread safe recursion

我有嵌套類CRecursion,它具有遞歸的方法。 這個CRecursion在很多線程中創建。 從主類的線程方法是安全的調用嗎? 謝謝。

class A {
method1() {....}

for(int i=0;i<100;i++){
   execute(new CRecursion(...))
 }

protected CRecursion {

calculate (par){
  if (some_condition) {
     calculate(par1)
 } else {
  String s=method1(value);
  .....
 }

}
....
}

變量值是Object。 但內部為每種方法。

如果遞歸例程使用的對象被限制在同一個線程中,那么是的,遞歸例程是線程安全的。 閱讀有關線程限制的相關StackOverflow問題以及它對線程安全的影響將有所幫助。

在這種特殊情況下(使用您發布的代碼),您需要確保:

  • CRecursion的構造函數的參數不能跨多個線程共享。 如果它們是共享的,那么以下幾點就變得相關了。
  • 不能在遞歸例程中訪問(讀取或寫入)在多個線程之間共享的任何對象。
  • 遞歸例程使用局限於當前堆棧幀的局部變量。 例程不能訪問任何其他共享存儲區域(Java調用堆棧除外)以在調用之間交換數據。
  1. 你在線程之間共享任何數據嗎?

如果對上述問題的回答為NO,那么該調用是隱式線程安全的。

如果你擔心局部變量會因為從不同線程多次調用相同的方法而出現亂碼,那么你就錯了。 每次調用方法都會創建自己的那些變量的單獨副本。

實質上,如果您不共享任何數據,則您的呼叫是線程安全的。

從技術上講,您仍然可以共享數據並保證線程安全,唯一的條件是對共享數據的所有訪問都必須是讀取操作。

我們需要有關您的計算方法的更多詳細信息來回答您的問題 如果您只使用本地范圍的變量(即您在方法中創建的變量/數據),那么您沒問題。

如果您正在訪問類中的數據,但只讀取該數據,那么您沒問題。

如果您正在訪問類中的數據,並且正在寫入該數據,則可能會出現問題。 這就是關鍵字synchronized的用途......您可以同步一個塊/代碼塊,這樣在任何給定時間只能執行一個塊。 當然,通常會有速度權衡。

希望有所幫助。

暫無
暫無

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

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