我有一个策略模式实现如下:
public class ConcreteStrategy implements Strategy {
public static final Strategy INSTANCE = new ConcreteStrategy();
public AClass execute(AClass aClass){
//...do somthing
return aClass;
}
}
忽略返回输入参数的错误做法,静态实例INSTANCE是否使用线程安全?
答案 0 :(得分:2)
假设ConcreteStrategy
未被修改,或仅以线程安全方式进行修改,则为是。 final
修饰符将确保(在Java 1.5+中)所有线程至少在初始化类时的状态中看到INSTANCE
对象。对象的任何后续更改都需要以通常的方式进行线程安全(通过挥发性,同步,提供线程安全的类等)。
答案 1 :(得分:1)
通常,java中不可变或无状态的任何Object都是线程安全的。
您的示例几乎线程安全。
INSTANCE的引用是线程安全的,因为它是最终的。但是ConcreteStrategy的内容可能非常好,而不是Thread安全(我们看不到代码,因此无法分辨)。
如果您为ConcreteStrategy对象提供了正确的同步,那么它可能是一个非常好的线程安全对象。
干杯,尤金。