public class Singleton {
private static Singleton instance = new Singleton();
private Singleton(){}
public static Singleton getInstance() {
return instance;
}
}
上面的例子,书里解释道:
单例在类被加载的时候实例化,这样多次加载会造成多次实例化。
类被多次加载的意思是什么?多个线程里被加载?
既然已经限定了 static 关键字,那 instance 应该被存储在全局和静态存储区里,不应该被多次事例化啊
1
Mirana 2015-02-24 13:41:07 +08:00
每次实例化的时候都重新执行一次把
|
3
mhycy 2015-02-24 13:53:24 +08:00 via Android
记忆中这是未定义行为,应该在get的时候判断是否为null并初始化
|
5
hitsmaxft 2015-02-24 14:25:32 +08:00 via iPhone
static {} 段的内容classloader在加载class的过程中被执行,多个classloader重复加载同一个class就就行多次。
|
7
georgetso OP @hitsmaxft 书中使用java作为示例。这个问题是否可能因为语言的不同出现不同的结果?例如,如果java和c++的 class loading 机制不一样的话会怎么样?
|
8
hitsmaxft 2015-02-25 10:03:17 +08:00 via iPhone
@georgetso 单例的本质是资源全局唯一。应该说这段代码是利用了java的static实现了单例。所以不同语言确实需要入乡随俗
|
9
ob 2015-02-25 10:45:24 +08:00
不同的语言对内存的管理上应该都是类似,楼主提的问题,下面我说下我的理解:
首个类和对象的区别,楼主肯定是知道的。 那一个类,肯定是可以被创造出多个对象的,也就是被实例化多次。 至于楼主说的static关键字,以及上面代码生成的单例。只能说在类被实例化多次的时候,用到的引用都是指向同一个对象。也就是实例化多次其实返回的是对一个对象。所以叫单例。 |
11
lip 2015-02-25 11:26:13 +08:00 1
private static Singleton instance = new Singleton();
这个是静态的,会在classloader第一次load这个class的时候执行,而且仅在这个时候执行。 之所以这样实现是单例,是因为一般情况下,按照java的类加载机制,一个类只会被一个classloader加载,而且仅加载一次,因此在一个jvm里面仅有这一个实例。 文中说的多次加载会造成多次实例化是指的非一般情况下,可能有多个classloader都加载这个class,因此每个classloader加载的时候都会实例化一个实例,也就是所谓的多次实例化。非一般情况常见的是那些web容器,比如tomcat,was;eclipse的插件实现也用了一堆的classloader,都会有这种现象 |