请教关于static 方法和单例模式问题
一个单例模式代码:
public class SingletonTest
{
public static void main(String[] args)
{
Singleton singleton = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();
System.out.println(singleton == singleton2);
}
}
class Singleton
{
private static Singleton singleton = new Singleton();
private Singleton()
{
}
public static Singleton getInstance()
{
return singleton;
}
}
singleton 和singleton2相同,是同一个对象,为什么呢?主要就是private static Singleton singleton = new Singleton();
这一句,加了static是不是说new Singleton()只执行一次,第一次Singleton singleton = Singleton.getInstance();时加载Singleton,初始化Singleton属性,第二次
Singleton singleton2 = Singleton.getInstance();时,因为内存中有singleton属性,就不new Singleton(),直接返回原singleton呢???
请大侠给解释解释,谢谢
这里使用的是饿汉式单例,对于private static Singleton singleton = new Singleton();有解释说jvm保证singleton只被初始化一次,这是一个什么机制????
是不是可以这样理解啊,对于
private static Singleton singleton = new Singleton();
可以看成这样:
private satic Singleton singleton;
static {singleton = new Singleton(); }
因为静态块只在类加载的时候执行一次,所以不管调用多少次,private static Singleton singleton = new Singleton();只执行一次,所以也就只有一个对象了。
请问以上理解是否正确?????
[解决办法]
理解不正确啊。
如果一个成员被声明为static,它是指能直接用类名点出成员名,而不必实例化对象,被static修饰的成员是类的所有实例共有的。
单例模式之所以是单例的原因是因为构造方法是私有的,你无法通过new来实例化一个Singleton的对象,而只能通过get方法来获得实例对象。
所以你两次获得的single对象是同一个。
[解决办法]