public class Singleton {
/**
* 创建对象
*/
private final static Singleton singleton = new Singleton();
/**
* 私有的构造方法,禁止其他调用
*/
private Singleton(){};
/**
* 对外开放的获取对象的方法
*/
public static Singleton getInstance (){
return singleton;
}
/**
*优点:这种写法比较简单,就是在类装载的时候就完成实例化。避免了线程同步问题。
*缺点:在类装载的时候就完成实例化,没有达到Lazy Loading的效果。如果从始至终从未使用过这个实例,则会造成内存的浪费。
*/
}
package com.wanshi.Danli;
public class Singleton2 {
private static volatile Singleton2 singleton2;
private Singleton2() {}
public static Singleton2 getInstance() {
if (singleton2 == null) {
synchronized (Singleton2.class) {
if (singleton2 == null) {
singleton2 = new Singleton2();
}
}
}
return singleton2;
/**
* Double-Check概念对于多线程开发者来说不会陌生,如代码中所示,
* 我们进行了两次if (singleton == null)检查,这样就可以保证线程安全了。
* 这样,实例化代码只用执行一次,后面再次访问时,判断if (singleton == null),直接return实例化对象。
* 优点:线程安全;延迟加载;效率较高。
*/
}
}