假设我有以下方法,线程安全吗?非同步静态方法和线程安全
public static void forwardProcessingPerStudy(String str)
{
someNonStaticMethodProcessingOnObj(str);
}
即:可能两个单独的线程运行,同时上述方法使STR的不同实例(比方说两个完全不同的字符串对象),并相互冲突?
对于线程使用安全的方法,我必须使它成为一个同步方法吗?
假设我有以下方法,线程安全吗?非同步静态方法和线程安全
public static void forwardProcessingPerStudy(String str)
{
someNonStaticMethodProcessingOnObj(str);
}
即:可能两个单独的线程运行,同时上述方法使STR的不同实例(比方说两个完全不同的字符串对象),并相互冲突?
对于线程使用安全的方法,我必须使它成为一个同步方法吗?
是的,两个不同的线程可以同时运行该方法,具有相同的字符串引用或不同的字符串引用。
至于你是否需要同步,完全取决于someNonStaticMethodProcessingOnObj
做什么。该名称意味着它调用非静态方法,但考虑到您没有指定调用它的实例,这似乎不太可能。
如果方法的主体(以及任何被调用的方法)不会对任何共享状态做任何事情,则不必担心。如果是这样,你需要更仔细地思考。
是的。
号
但随着法someNonStaticMethodProcessingOnObj的答案可能是不同的。
显示的方法是线程安全的,因为它不访问任何对象上的任何有状态信息。这就是说,我们不知道是否someNonStaticMethdoProcessingOnObj()是否是,更不用说名称暗示它是非静态的,但它不针对任何实例运行。
如果调用不是没有任何形式的同步的线程安全的方法,它是一种线程安全方法吗? –
这里有一个答案,我增加了一些例子,可能使这个明确为你一个类似的问题: difference between synchronizing a static method and a non static method
的事情是,将同步到外方法可能不帮助,因为这对相关的同步Class对象。内部方法可能需要在别的东西上同步。所以需要一些谨慎。
辉煌,非常有用的解释。谢谢。 – james4563
谢谢,我应该更仔细地写我的例子,我没有用someNonStaticMethodProcessingOnObj()方法使它过度清晰。 我认为你已经回答了我的问题,但是如果从不同的线程运行,不同的String对象可能会在该方法内发生冲突/更改。 – james4563
@James:字符串是不可变的,也是线程安全的,所以不同的字符串不会成为问题 - 除非他们习惯于为共享状态做其他事情。 –
谢谢,现在已经很完美了。 – james4563