静态实例线程安全

时间:2012-02-09 13:36:52

标签: java multithreading

我有一个策略模式实现如下:

    public class ConcreteStrategy implements Strategy {

         public static final Strategy INSTANCE = new ConcreteStrategy();

         public AClass execute(AClass aClass){
              //...do somthing
              return aClass;
         }
    }

忽略返回输入参数的错误做法,静态实例INSTANCE是否使用线程安全?

2 个答案:

答案 0 :(得分:2)

假设ConcreteStrategy未被修改,或仅以线程安全方式进行修改,则为是。 final修饰符将确保(在Java 1.5+中)所有线程至少在初始化类时的状态中看到INSTANCE对象。对象的任何后续更改都需要以通常的方式进行线程安全(通过挥发性,同步,提供线程安全的类等)。

答案 1 :(得分:1)

通常,java中不可变或无状态的任何Object都是线程安全的。

您的示例几乎线程安全。

INSTANCE的引用是线程安全的,因为它是最终的。但是ConcreteStrategy的内容可能非常好,而不是Thread安全(我们看不到代码,因此无法分辨)。

如果您为ConcreteStrategy对象提供了正确的同步,那么它可能是一个非常好的线程安全对象。

干杯,尤金。