2011-09-23 131 views
3

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

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。但每種方法的內部。

+0

不同的調用是否共享相同的可變數據?還是他們都在使用本地方法來處理數據? –

+0

如果你有一個CPU綁定進程,它可能會使用的最佳線程數是你擁有的核心數。例如如果你有4個內核,只能使用4個線程。這可以幫助您確定這是不是一個好主意。;) –

+0

此外,在函數式語言中使用遞歸最好表示的東西通常最好在Java中作爲循環執行。即更快。在有些情況下,遞歸是最快的,但在Java中這種情況相對較少。 –

回答

3

如果遞歸例程使用的對象被限制在同一個線程中,那麼是的,遞歸例程是線程安全的。這將有助於閱讀this related StackOverflow question on thread confinement and it's impact on thread-safety

在這種特殊情況下(與您發佈的代碼),你需要確保:

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

如果對上述問題的回答爲NO,則該調用隱式地是線程安全的。

如果您擔心局部變量會通過多次調用來自不同線程的相同方法而出現亂碼,那麼您就錯了。每個方法的調用都創建它們自己的這些變量的單獨副本。

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

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

1

我們需要更多關於計算方法的信息來回答您的問題。如果你只使用本地作用域變量(例如,你在方法中創建的變量/數據),那麼你很好。

如果您正在訪問類中的數據,但只讀取該數據,那麼您很好。

如果您正在訪問班級內的數據,並且已將寫入該數據,則可能有問題。這就是關鍵字同步用於...您可以同步代碼塊/代碼塊,以便在任何給定時間只能執行一個代碼塊。當然,這通常有一個速度折衷。

希望有所幫助。