懒汉模式
/**
* 懒汉式单例类.在第一次调用的时候实例化自己
*
*/
public class Singleton {
//Singleton通过将构造方法限定为private避免了类在外部被实例化,
//在同一个虚拟机范围内,Singleton的唯一实例只能通过getInstance()方法访问。
private Singleton(){}
private static Singleton single=null;
//没考虑线程安全问题
// public static Singleton getInstance(){
// if (single==null) {
// single = new Singleton();
// }
// return single;
// }
//getInstance加上同步
// public static synchronized Singleton getInstance() {
// if (single == null) {
// single = new Singleton();
// }
// return single;
//}
//双重if检测锁定
public static Singleton getInstance() {
if (single == null) {
synchronized (Singleton.class) {
if (single == null) {
single = new Singleton();
}
}
}
return single;
}
}
饿汉模式
饿汉式单例类.在类初始化时,已经自行实例化
饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用
以后不再改变,所以天生是线程安全的
public class Singleton1 {
private Singleton1(){}
private static final Singleton1 single=new Singleton1();
public static Singleton1 getInstance(){
return single;
}
}
测试
public class TestSingleton {
public static void main(String[] args) {
//懒汉模式
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
if (s1==s2) {
System.out.println("s1和s2是同一个实例"+s1);
}else {
System.out.println("s1和s2不是同一个实例");
}
//饿汉模式
Singleton1 s3 = Singleton1.getInstance();
Singleton1 s4 = Singleton1.getInstance();
if (s3==s4) {
System.out.println("s3和s4是同一个实例"+s3);
}else {
System.out.println("s3和s4不是同一个实例");
}
}
}