2013-03-10 104 views
2

我有以下两类:的Java:线程安全类的实例

public class MyClass { 

    public static void faceTheWorld(String Input){ 
     SafeClass sC = new SafeClass(); 
     sC.workWithInput(Input); 
    } 
} 

public class SafeClass { 
    public void workWithInput{String allInp) 

    work with allInp... 
} 

我的问题是。如果我几次同时调用MyClass.FaceTheWorld(),它是否总是创建一个新的SafeClass类实例,或者它会试图始终创建一个名为'sC'的实例?

我需要创建一个实例数组来避免同时创建同一个实例吗?这在Java中看起来如何?

最终,我试图实现的是,当我用'输入'调用FaceTheWorld时,它总是会确保'输入'是线程安全的,例如,没有其他实例可以修改/访问它。

我让SafeClass同步,这会解决问题吗?

非常感谢

+0

我们很高兴看到下面的java命名约定。 – AmitG 2013-03-10 16:53:40

+0

嗨阿米特,你是什么意思? – L4zl0w 2013-03-10 16:56:39

+0

在编写方法名称时使用骆驼案例并在编写类名时使用pascal案例(您遵循类名称) – AmitG 2013-03-10 17:00:23

回答

1

它会每次创建一个新的实例,所以它应该是线程安全的,除非你没有告诉我们任何其他奇怪的东西(比如在你调用的方法中使用静态变量的那个对象)。但是如果你担心它会在每次通话中使用相同的对象,它不会。

+0

谢谢凯文。我现在偏执于此,所以只是再次确认。即使在代码中我们正在创建一个新实例的'C',在内存中它将永远是一个不同的新实例?谢谢 – L4zl0w 2013-03-10 16:58:52

+0

@ L4zl0w正确 – 2013-03-10 16:59:22

1

只要你不访问可以被其他线程(类的成员,或静态变量),你将永远不会有任何竞争条件改变的变量,如果你只是在创建新实例一个静态方法(或任何其他方法),因为每个方法都有自己的变量堆栈。

而且要具体到你的问题:

它总是会创建一个新的实例。

1

无论您多久初始化它,它总是会创建新实例。 Synchroznied关键字不能解决您的问题。