2011-06-28 66 views
0

假设我有以下方法,线程安全吗?非同步静态方法和线程安全

public static void forwardProcessingPerStudy(String str) 
{ 
     someNonStaticMethodProcessingOnObj(str); 
} 

即:可能两个单独的线程运行,同时上述方法使STR的不同实例(比方说两个完全不同的字符串对象),并相互冲突?

对于线程使用安全的方法,我必须使它成为一个同步方法吗?

回答

4

是的,两个不同的线程可以同时运行该方法,具有相同的字符串引用或不同的字符串引用。

至于你是否需要同步,完全取决于someNonStaticMethodProcessingOnObj做什么。该名称意味着它调用非静态方法,但考虑到您没有指定调用它的实例,这似乎不太可能。

如果方法的主体(以及任何被调用的方法)不会对任何共享状态做任何事情,则不必担心。如果是这样,你需要更仔细地思考。

+0

谢谢,我应该更仔细地写我的例子,我没有用someNonStaticMethodProcessingOnObj()方法使它过度清晰。 我认为你已经回答了我的问题,但是如果从不同的线程运行,不同的String对象可能会在该方法内发生冲突/更改。 – james4563

+0

@James:字符串是不可变的,也是线程安全的,所以不同的字符串不会成为问题 - 除非他们习惯于为共享状态做其他事情。 –

+0

谢谢,现在已经很完美了。 – james4563

0

是的。

但随着法someNonStaticMethodProcessingOnObj的答案可能是不同的。

0

显示的方法是线程安全的,因为它不访问任何对象上的任何有状态信息。这就是说,我们不知道是否someNonStaticMethdoProcessingOnObj()是否是,更不用说名称暗示它是非静态的,但它不针对任何实例运行。

+0

如果调用不是没有任何形式的同步的线程安全的方法,它是一种线程安全方法吗? –

0

这里有一个答案,我增加了一些例子,可能使这个明确为你一个类似的问题: difference between synchronizing a static method and a non static method

的事情是,将同步到外方法可能不帮助,因为这对相关的同步Class对象。内部方法可能需要在别的东西上同步。所以需要一些谨慎。

+0

辉煌,非常有用的解释。谢谢。 – james4563