1./* 安全的方式 */
2.public class Singleton {
3.
4. private static Singleton instance = new Singleton();
5.
6. private Singleton() {}
7.
8. public static Singleton getInstance() {
9. return instance;
10. }
11.
12.} /*非线程安全的方式*/
1.public class Singleton {
2.
3. private Singleton() {}
4. private static Singleton instance = null;
5.
6. public static Singleton getInstance() {
7. if(instance == null) {
8. instance = new Singleton();
9. }
10. return instance;
11. }
12.}
我看到解释如下:第一种方式虽然没有使用同步,但确保了调用static getInstance()方法时才创建Singleton的引用(static 的成员变量在一个类中只有一份)。
---------------------------
我不理解的是,为何说是“调用static getInstance()方法时才创建Singleton的引用”
不是一开始申明static变量的时候就创建了吗private static Singleton instance = new Singleton();
按我的理解两种方式申明instance不是一样的么,都是private static的,只是创建时间不一样而已
为何说第一种比第二种安全?忘高手详细解释,指点一下
2.public class Singleton {
3.
4. private static Singleton instance = new Singleton();
5.
6. private Singleton() {}
7.
8. public static Singleton getInstance() {
9. return instance;
10. }
11.
12.} /*非线程安全的方式*/
1.public class Singleton {
2.
3. private Singleton() {}
4. private static Singleton instance = null;
5.
6. public static Singleton getInstance() {
7. if(instance == null) {
8. instance = new Singleton();
9. }
10. return instance;
11. }
12.}
我看到解释如下:第一种方式虽然没有使用同步,但确保了调用static getInstance()方法时才创建Singleton的引用(static 的成员变量在一个类中只有一份)。
---------------------------
我不理解的是,为何说是“调用static getInstance()方法时才创建Singleton的引用”
不是一开始申明static变量的时候就创建了吗private static Singleton instance = new Singleton();
按我的理解两种方式申明instance不是一样的么,都是private static的,只是创建时间不一样而已
为何说第一种比第二种安全?忘高手详细解释,指点一下
因为instance是static成员变量,它是在类加载的时候进行初始化的,而jvm的类加载机制保证了只有一个线程会对它进行初始化,绝对不会存在线程安全问题,这是由jvm来保证的。
第二个为啥不安全?
就不用说了吧
我的问题是:第一种方式的instance = new Singleton(); 这个new操作时在类装载的时候
就创建么?
这种方式并没有在类加载的时候就进行初始化。