zoukankan      html  css  js  c++  java
  • 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();
    	}
    }
    
    
  • 相关阅读:
    第二阶段团队站立会议06
    第二阶段团队站立会议05
    Spring
    JVM
    线程池
    java内存模型
    线程
    接口与抽象类
    动态绑定,多态,static
    同步异步,并发并行概念的理解
  • 原文地址:https://www.cnblogs.com/qichunlin/p/8452315.html
Copyright © 2011-2022 走看看