单例模式,保证一个类只有一个实例,并提供一个方法访问这个对象。
package com.aa.singleton;
/**
* 测试饿汉式单例模式
*/
public class SingletonDemo1 {
//静态属性
// 由于加载类时,天然线程安全
//如果创建好了没有调用这个方法使用这个对象,浪费了资源(缺点)
private static SingletonDemo1 instance = new SingletonDemo1();//类初始化时立即加载
//如果初始化的时候没有加载就是懒加载,也叫延时加载
//私有构造器
private SingletonDemo1() {
}
//饿汉式线程安全,不需要加同步代码块synchronized的标记,调用效率高
public static SingletonDemo1 getInstance() {
return instance;
}
}
package com.aa.singleton;
//懒汉式 lazy load 延迟加载
public class SingletonDemo2 {
//类初始化的时候,不初始化这个对象(延时加载,真正用的时候再创建)
private static SingletonDemo2 s;
private SingletonDemo2() {//私有化构造器
}
//优点:真正用的时候才加载,资源利用率高了
//缺点:每次调用getInstance()方法都要同步,并发效率低,调用效率低
public static synchronized SingletonDemo2 getInstance() {
if (s == null) {
s = new SingletonDemo2();
}
return s;
}
}
package com.aa.singleton;
public class Client {
public static void main(String[] args) {
SingletonDemo1 s = SingletonDemo1.getInstance();
SingletonDemo1 s2 = SingletonDemo1.getInstance();
System.out.println(s == s2); //true
SingletonDemo2 ss = SingletonDemo2.getInstance();
SingletonDemo2 ss2 = SingletonDemo2.getInstance();
System.out.println(ss == ss2); //true
}
}