2011-09-23 130 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

我们需要更多关于计算方法的信息来回答您的问题。如果你只使用本地作用域变量(例如,你在方法中创建的变量/数据),那么你很好。

如果您正在访问类中的数据,但只读取该数据,那么您很好。

如果您正在访问班级内的数据,并且已将写入该数据,则可能有问题。这就是关键字同步用于...您可以同步代码块/代码块,以便在任何给定时间只能执行一个代码块。当然,这通常有一个速度折衷。

希望有所帮助。