java非同步静态方法与线程安全
假设我有下面的方法,这个方法是线程安全的吗
public static void forwardProcessingPerStudy(String str)
{
someNonStaticMethodProcessingOnObj(str);
}
即:两个单独的线程是否可以同时运行上述方法来传递str的不同实例(比如两个完全不同的字符串对象)并相互冲突
对于线程使用安全的方法,我是否必须使其成为同步方法
你可以在下面搜索框中键入要查询的问题!
假设我有下面的方法,这个方法是线程安全的吗
public static void forwardProcessingPerStudy(String str)
{
someNonStaticMethodProcessingOnObj(str);
}
即:两个单独的线程是否可以同时运行上述方法来传递str的不同实例(比如两个完全不同的字符串对象)并相互冲突
对于线程使用安全的方法,我是否必须使其成为同步方法
# 1 楼答案
显示的方法是线程安全的,因为它不访问任何对象上的任何有状态信息
尽管如此,我们不知道someNonStatimethodProcessingNobj()是否是静态的,更不用说它的名字暗示它是非静态的,但它不会针对任何实例运行
# 2 楼答案
是的,两个不同的线程可以同时运行该方法,使用相同的字符串引用或不同的字符串引用
至于是否需要同步,这完全取决于
someNonStaticMethodProcessingOnObj
做什么。这个名字意味着它正在调用一个非静态方法,但鉴于您没有指定要调用它的实例,这似乎不太可能如果方法体(以及任何被调用的方法)没有对任何共享状态做任何事情,您就不必担心。如果确实如此,你需要更仔细地思考
# 3 楼答案
对
没有
但是使用方法某些非静态方法处理nobj的答案可能会有所不同
# 4 楼答案
下面是一个类似问题的答案,我在其中添加了一些示例,可能会让您明白这一点: difference between synchronizing a static method and a non static method
问题是,将synchronized添加到外部方法可能没有帮助,因为这会在关联的类对象上进行同步。内部方法可能需要与其他方法同步。所以需要一些照顾