2018.2.17 设计模式中的单例模式下的懒汉式和饿汉式的区别
设计模式中的懒汉式和饿汉式的区别
总结一下,两种方案的构造函数和公用方法都是静态的(static),实例和公用方法又都是私有的(private)。但是饿汉式每次调用的时候不用做创建,直接返回已经创建好的实例。这样虽然节省了时间,但是却占用了空间,实例本身为static的,会一直在内存中带着。懒汉式则是判断,在用的时候才加载,会影响程序的速度。最关键的是,在并发的情况下,懒汉式是不安全的。如果两个线程,我们称它们为线程1和线程2,在同一时间调用getInstance()方法,如果线程1先进入if块,然后线程2进行控制,那么就会有两个实例被创建。
懒汉式
package com.glut.demo6;
public class MySingleton {
//设立静态变量
private static MySingleton mySingleton = null;
//私有化构造函数
private MySingleton() {
System.out.println("懒汉式单例模式开始调用构造函数");
}
//开放一个共有方法,判断是否已经存在实例,又返回,没有就创建
public static MySingleton getInstance() {
if(mySingleton == null) {
System.out.println("懒汉式构造函数的实例当前并没有被创建");
mySingleton = new MySingleton();
}else {
System.out.println("懒汉式构造函数的实例已经被创建");
}
System.out.println("方法调用结束,返回单例");
return mySingleton;
}
}
package com.glut.demo6;
/**
* 懒汉式单例模式
* @author qichunlin
*
*/
public class Client {
public static void myprint() {
System.out.println("懒汉式单例模式");
System.out.println("第一次取得实例");
MySingleton s1 = MySingleton.getInstance();
System.out.println("第二次取得实例");
MySingleton s2 = MySingleton.getInstance();
if(s1 ==s2) {
System.out.println("两个实例相同");
}
System.out.println();
}
public static void main(String[] args) {
//懒汉式
myprint();
}
}
饿汉式
package com.glut.demo5;
/**
* 创建一个Singleton类
* 饿汉式
*
* 饿汉式的特点是一开始就加载了,如果说懒汉式是“时间换空间”,那么饿汉式
* 就是“空间换时间”,因为一开始就创建了实例,所以每次用到的之后直接返回就好了
*
* @author qichunlin
*
*/
public class SingleObject {
//创建SingleObject的一个对象,直接创建实例
private static SingleObject instance = new SingleObject();
//让构造函数为private,这样该类就不会被实例化了
private SingleObject() {
super();
}
//获得唯一可用对象
public static SingleObject getInstance() {
return instance;
}
//显示信息
public void showMessage() {
System.out.println("Hello World!");
}
}
package com.glut.demo5;
/**
* 单例模式 从 singleton 类获取唯一的对象。
*
* @author qichunlin
*
*/
public class Test {
public static void main(String[] args) {
// 不合法的构造函数
// 编译时错误:构造函数 SingleObject() 是不可见的
// SingleObject object = new SingleObject();
// 获取唯一可用的对象
SingleObject object = SingleObject.getInstance();
// 显示信息
object.showMessage();
}
}