Java 这个实用程序类有2个静态方法是线程安全的吗?
下面的实用程序类本身调用相同的静态方法,但没有共享的全局变量。但是方法nameTo()看起来是“共享”的,并且是一个问题。我说的对吗?这是不安全的Java 这个实用程序类有2个静态方法是线程安全的吗?,java,multithreading,thread-safety,static-methods,Java,Multithreading,Thread Safety,Static Methods,下面的实用程序类本身调用相同的静态方法,但没有共享的全局变量。但是方法nameTo()看起来是“共享”的,并且是一个问题。我说的对吗?这是不安全的 public class Utility { public static MyObject create_1(boolean b) { MyObject o = new MyObject(); o.setName(nameTo(b)); return o;
public class Utility
{
public static MyObject create_1(boolean b)
{
MyObject o = new MyObject();
o.setName(nameTo(b));
return o;
}
public static MyObject create_2(boolean b)
{
MyObject o = new MyObject();
o.setName(nameTo(b));
return o;
}
public static String nameTo(boolean b)
{
if(b)
return "NameA";
else
return "NameB";
}
}
由于您的
nameTo()
方法是无状态的,因此在多线程上下文中它没有问题。代码可以在线程之间共享。重要的是数据。因为您的nameTo()
方法是无状态的,所以在多线程上下文中它没有问题。代码可以在线程之间共享。重要的是数据。所有静态方法都在线程之间共享。由于nameTo()
方法没有它正在使用的任何共享状态,因此是线程安全的
class Utility{
private static int sharedValue; //something like counter of how many times nameTo() is called
public static String nameTo(boolean b){
//logic
sharedValue++; //this will not be thread safe as it is shared state and being updated in parallel
}
}
所有静态方法都在线程之间共享。由于
nameTo()
方法没有它正在使用的任何共享状态,因此是线程安全的
class Utility{
private static int sharedValue; //something like counter of how many times nameTo() is called
public static String nameTo(boolean b){
//logic
sharedValue++; //this will not be thread safe as it is shared state and being updated in parallel
}
}
您没有处于
全局状态的数据,因此我看不到任何线程安全问题。
所有方法都不会更改任何共享数据
您没有处于全局状态的数据
,因此我看不到任何线程安全问题。
所有方法都不会更改任何共享数据
该代码没有问题。无论如何,您都没有使用线程,为什么您认为这会是一个问题?除了create_1()
和create_2()
的主体看起来是相同的之外,这似乎没有什么问题。@MrLore应该是一个答案。它是一个可以被称为数百次并行的实用程序类。那么,nameTo()方法可能会被不同的布尔值覆盖?create()方法可以用不同的布尔值调用,它们将被转发到nameTo()@MrLore。你不能说OP没有使用线程,因为提供的代码示例只有一个类,你不知道它是如何使用的。这段代码没有错。无论如何,您都没有使用线程,为什么您认为这会是一个问题?除了create_1()
和create_2()
的主体看起来是相同的之外,这似乎没有什么问题。@MrLore应该是一个答案。它是一个可以被称为数百次并行的实用程序类。那么,nameTo()方法可能会被不同的布尔值覆盖?create()方法可以用不同的布尔值调用,这些布尔值将被转发到nameTo()@MrLore。你不能说OP没有使用线程,因为提供的代码示例只有一个类,你不知道它是如何使用的。那么这是否意味着我可以在静态类中有任意数量的方法相互调用(使用所有类型的对象作为参数),它仍然是线程安全的,只是因为我没有使用某种全局变量(可以通过其中一种方法修改)在同一个类中?是的,该类可以被称为线程安全的,但是对于作为参数传递给该类的方法的对象,不能说什么,它们本身可以是非线程安全的。那么这是否意味着在静态类中可以有任意数量的方法相互调用(使用所有类型的对象作为参数),它仍然是线程安全的,只是因为我没有使用某种全局变量(可以通过其中一种方法修改)在同一个类中?是的,该类可以称为线程安全的,但不能说明作为参数传递给该类方法的对象,它们本身可以是非线程安全的。