一个单例模式代码:
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();只执行一次,所以也就只有一个对象了。请问以上理解是否正确?????
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();只执行一次,所以也就只有一个对象了。请问以上理解是否正确?????
如1楼所说,你理解不正确。根本没有第二次这个概念。static的属性,是在类定义被JVM所加载时就初始化完毕的,跟被调用次数毫无关系。
差不多,只是你这么进行表述,猛看起来因果有点反。首先单例模式本身设计意图上就是要避免多次new对象出来,为了实现这两个目标:
1、限制外部无法调用其构造函数;
2、内部控制好一定都是返回同一个实例,而不会意外发生多次new。