Java 这个单例类会在多线程中引起问题吗
以下单例类代码会在多线程环境中导致任何问题吗Java 这个单例类会在多线程中引起问题吗,java,design-patterns,Java,Design Patterns,以下单例类代码会在多线程环境中导致任何问题吗 public class mySingletonClass{ private static mySingletonClass INSTANCE = new mySingletonClass(); private mySingletonClass() { super(); } public static mySingletonClass getI
public class mySingletonClass{
private static mySingletonClass INSTANCE = new mySingletonClass();
private mySingletonClass()
{
super();
}
public static mySingletonClass getInstance()
{
return INSTANCE;
}
}
上面的代码不应该在多线程环境中引起任何问题,因为实例是在类加载期间创建的,并且只会发生一次
无论何时调用getInstance(),即使它是并发的,也不会引起任何问题 上述代码不应在多线程环境中引起任何问题,因为在类加载期间创建了实例,并且只会创建一次
无论何时调用getInstance(),即使它是并发的,也不会引起任何问题 该类是线程安全的主要原因是该类中没有可在多个线程之间共享的资源例如实例变量 这个类是单例的,因为当第一次调用
mySingletonClass.getInstance()
加载这个类时,JVM将只为这个类创建一个对象。
现在,每次调用此方法时,都会返回相同的实例。但是现在考虑下面的场景:
public class mySingletonClass{
int x;
public vois setX(int x){
this.x = x;
}
public int getX(){
return x;
}
private static mySingletonClass INSTANCE = new mySingletonClass();
private mySingletonClass()
{
super();
}
public static mySingletonClass getInstance()
{
return INSTANCE;
}
}
现在有一个
实例变量x
。现在,由于这个类是单例的,所以相同的对象将在多个线程之间共享,这意味着相同的实例变量x
。现在,您无法确保不同的线程正在访问正确的x
值。然后,您必须使用不同的方式,以便一次只有一个线程访问共享资源,在上述情况下,共享资源是x
。为此,您可以使setX(int x)和getX()方法同步,或者可以创建一个对象锁
,它将确保一次只有一个线程变异变量x
该类是线程安全的主要原因是该类中没有可在多个线程之间共享的资源例如实例变量
这个类是单例的,因为当第一次调用mySingletonClass.getInstance()
加载这个类时,JVM将只为这个类创建一个对象。
现在,每次调用此方法时,都会返回相同的实例。但是现在考虑下面的场景:
public class mySingletonClass{
int x;
public vois setX(int x){
this.x = x;
}
public int getX(){
return x;
}
private static mySingletonClass INSTANCE = new mySingletonClass();
private mySingletonClass()
{
super();
}
public static mySingletonClass getInstance()
{
return INSTANCE;
}
}
现在有一个instance变量x
。现在,由于这个类是单例的,所以相同的对象将在多个线程之间共享,这意味着相同的实例变量x
。现在,您无法确保不同的线程正在访问正确的x
值。然后,您必须使用不同的方式,以便一次只有一个线程访问共享资源,在上述情况下,共享资源是x
。为此,您可以使setX(int x)和getX()方法同步,或者可以创建一个对象锁
,它将确保一次只有一个线程变异变量x
全班似乎什么也没做。你能详细说明一下你会遇到什么问题吗?您是否遗漏了一些信息,例如类正在封装的共享资源?当您急切地在事实上是线程安全的初始值设定项中初始化实例时,单例实例化/检索是线程安全的。但事实上,你的单身没有提供任何行为。请为您的类提供行为方法,我们可以判断这些方法是否是线程安全的。该类似乎没有做任何事情。你能详细说明一下你会遇到什么问题吗?您是否遗漏了一些信息,例如类正在封装的共享资源?当您急切地在事实上是线程安全的初始值设定项中初始化实例时,单例实例化/检索是线程安全的。但事实上,你的单身没有提供任何行为。请为您的类提供行为方法,我们可以判断这些方法是否是线程安全的。实例不是在编译时创建的。它是在类加载器第一次加载类时创建的。更新了答案感谢它实际上发生在类初始化时。。。加载[:-)后的某些步骤会发生这种情况(例如,ClassLoader.loadClass()
不会初始化类)[很挑剔,我知道,答案是肯定的]感谢您提供的信息:)实例不是在编译时创建的。它是在类加载器首次加载类时创建的。更新了答案感谢实际发生在类初始化时…这发生在加载[:-)后的一些步骤中(例如classloader.loadClass()
不会初始化类)[挑剔,我知道,答案还可以]谢谢你的信息:)