Java 这个实用程序类有2个静态方法是线程安全的吗?

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;

下面的实用程序类本身调用相同的静态方法,但没有共享的全局变量。但是方法nameTo()看起来是“共享”的,并且是一个问题。我说的对吗?这是不安全的

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没有使用线程,因为提供的代码示例只有一个类,你不知道它是如何使用的。那么这是否意味着我可以在静态类中有任意数量的方法相互调用(使用所有类型的对象作为参数),它仍然是线程安全的,只是因为我没有使用某种全局变量(可以通过其中一种方法修改)在同一个类中?是的,该类可以被称为线程安全的,但是对于作为参数传递给该类的方法的对象,不能说什么,它们本身可以是非线程安全的。那么这是否意味着在静态类中可以有任意数量的方法相互调用(使用所有类型的对象作为参数),它仍然是线程安全的,只是因为我没有使用某种全局变量(可以通过其中一种方法修改)在同一个类中?是的,该类可以称为线程安全的,但不能说明作为参数传递给该类方法的对象,它们本身可以是非线程安全的。