Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 静态实例线程安全_Java_Multithreading - Fatal编程技术网

Java 静态实例线程安全

Java 静态实例线程安全,java,multithreading,Java,Multithreading,我的战略模式实施如下: public class ConcreteStrategy implements Strategy { public static final Strategy INSTANCE = new ConcreteStrategy(); public AClass execute(AClass aClass){ //...do somthing return aClass;

我的战略模式实施如下:

    public class ConcreteStrategy implements Strategy {

         public static final Strategy INSTANCE = new ConcreteStrategy();

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

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

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

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

您的示例几乎是线程安全的

对实例的引用是线程安全的,因为它是最终的。但是ConcreteStrategy的内容可能不是线程安全的(我们没有看到代码,因此无法判断)

如果为ConcreteStrategy对象提供适当的同步,那么它很可能是线程安全的对象


干杯,Eugene。

如果我错了,请纠正我:当我调用函数时,一个对象引用副本被传递给该方法,因此每次该方法在不同的对象上执行时。该类用于webapp,调用仅共享代码?@landal79:Java传递引用的副本。所以“aClass”参数是引用的副本。但是正在使用和返回的AClass对象是相同的。把它看作是指针。您可以传递指针、指针副本等,但指针对象是相同的。如果有一个
new
,那么就有一个对象。新JMM的“最终字段语义”在这里是不相关的。静态初始化器完成工作后,所有线程都将看到一个完全初始化的
ConcreteStrategy
类,只要它没有做一些真正愚蠢的事情。@TomHawtin tackline为什么?就我在JLS中所看到的,在类初始化期间发生的唯一同步是线程在初始化期间锁定类。如果该类在线程第一次看到它时就已经初始化,那么该线程将不会在该类上同步,因此静态初始化和该线程读取字段之间没有“先发生后发生”关系。我相信另一个线程能够看到空引用或部分构造的对象。这很少见,但JLS允许。@yshavit在Java SE 7 JVM规范第5.5节的底部看到了十几个步骤的过程。“对于每个类或接口C,都有一个唯一的初始化锁LC。[等等等等,等等]”。顺便说一下:添加一个私有构造函数,这样你就知道没有人在创建另一个ConcreteStrategy实例了(如果这是您想要的行为:)并使类
成为final
。假设
execute()
方法仅在parameter@landal79我不明白你说只执行一个参数是什么意思。你能再详细一点吗?
execute()
method对
aClass
实例字段值进行一些计算,ConcreteStrategy类没有内部状态只是一个算法。@landal79如果你说ConcreteStrategy没有内部状态,你的意思是它没有实例变量(内部状态),只有一个方法,那么它是线程安全的。