【问题标题】:Is this utility class with 2 static methods threadsafe?这个具有 2 个静态方法的实用程序类是线程安全的吗?
【发布时间】:2013-08-28 19:34:05
【问题描述】:

以下 Utility 类在其自身内部调用相同的静态方法,但没有共享全局变量。但看起来方法 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";         
    }
}

【问题讨论】:

  • 该代码没有问题。反正你没有使用线程,你为什么认为这会是个问题?
  • 除了create_1() 和create_2() 的主体看起来相同之外,这似乎没有什么问题。
  • @MrLore 应该是一个答案。
  • 它是一个实用程序类,可能会被并行调用数百次。那么也许 nameTo() 方法可以被不同的布尔值覆盖? create() 方法可以用不同的布尔值调用,这些布尔值将被转发到 nameTo()
  • @MrLore 你不能说 OP 没有使用线程,因为提供的代码示例只有一个类,你不知道它是如何使用的。

标签: java multithreading thread-safety static-methods


【解决方案1】:

由于您的nameTo() 方法是无状态的,因此在多线程上下文中没有问题。代码可以在线程之间尽可能多地共享。重要的是数据。

【讨论】:

    【解决方案2】:

    所有静态方法在线程之间共享。由于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
    
      }
    }
    

    【讨论】:

    • 这是否意味着我可以在静态类中拥有任意数量的方法,这些方法相互调用(使用各种对象作为参数)并且它仍然是线程安全的,只是因为我不使用同一个类中的某种全局变量(可以通过其中一种方法修改)?
    • 是的,该类可以称为线程安全的,但是对于作为参数传递给该类方法的对象,不能说什么,它们本身可能是非线程安全的。
    【解决方案3】:

    global state 中没有数据,所以我看不到任何线程安全问题。 这些方法都没有改变任何shared data。

    【讨论】:

      猜你喜欢
      • 2016-07-16
      • 1970-01-01
      • 1970-01-01
      • 2011-08-03
      • 1970-01-01
      • 2010-11-08
      • 1970-01-01
      相关资源
      最近更新 更多