zoukankan      html  css  js  c++  java
  • 设计模式(一)—单例模式

    一、概述

    1.单例模式的优点

         由于单例模式只生成一个实例,减少了系统性能的开销,当一个对象的产生需要比较多的资源时,如读取配置,产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久助理内存的方式来解决。

    2.单例模式的实现方式

    (1)饿汉式

         线程安全,调用效率高,不能延迟加载。

    (2)懒汉式

         线程安全,调用效率不高,可以延迟加载。

    (3)静态内部类式

         线程安全,调用效率高,可以延迟加载。

    二、实现方式

    1.饿汉式

         饿汉式,static变量会在类装载时初始化,此时不会涉及多个线程多个线程对象访问该对象的问题。虚拟机保证只装载一次该类,肯定不会发生并发访问问题,因此可以省略sychronized关键字。

    /*
     * 懒汉式
     * 	特点: 线程安全,调用效率高,不能延迟加载。
     */
    public class Singleton{
    
    	//类初始化时立即加载,由于加载类时是线程安全的
    	private static Singleton instance = new Singleton();
    	
    	private Singleton(){
    		
    	}
    	
    	//方法没有同步,调用效率高
    	public static Singleton getInstance(){
    		return instance;
    	}
    }

    测试

    	@Test
    	public void testS1(){
    		Singleton s1 = Singleton.getInstance();
    		Singleton s2 = Singleton.getInstance();
    		System.out.println(s1 == s2);//true
    	}

    2.懒汉式

         因为每次调用getInstance()方法都要同步,并发效率低。

    /*
     * 懒汉式
     *   特点:线程安全,调用效率不高,可以延迟加载。
     */
    public class Singleton2{
    
    	private static Singleton2 instance;
    	
    	private Singleton2(){
    		
    	}
    	
    	public static synchronized Singleton2 getInstance(){
    		if(instance == null){
    			instance = new Singleton2();
    		}
    		return instance;
    	}
    }

    测试

    	@Test
    	public void testS2(){
    		Singleton2 s1 = Singleton2.getInstance();
    		Singleton2 s2 = Singleton2.getInstance();
    		System.out.println(s1 == s2);//true
    	}

    3.静态内部类

    /*
     * 静态内部类
     */
    public class Singleton3{
    	
    	private Singleton3(){
    		
    	}
    	
    	private static class SingletonInstance{
    		//保证内存在只有一个这样的实例
    		private static final Singleton3 instance = new Singleton3();
    	}
    	
    	public static Singleton3 getInstance(){
    		return SingletonInstance.instance;
    	}
    }
    测试
    	@Test
    	public void testS3(){
    		Singleton3 s1 = Singleton3.getInstance();
    		Singleton3 s2 = Singleton3.getInstance();
    		System.out.println(s1 == s2);//true
    	}
  • 相关阅读:
    [转载]Linux下mail使用技巧
    VTK Online教程大全
    拓扑结构与TopoDS
    三维视图变换与相机模型
    说说DoDataExchange(CDataExchange* pDX)
    Lua Lib在VC下的编译
    建立最简单的OpenCASCADE程序
    构建通用类型 继承 VS 聚合
    【软件】新瓶装老酒 MyCapture
    用std::find查找文件流中的内容
  • 原文地址:https://www.cnblogs.com/yangang2013/p/5706048.html
Copyright © 2011-2022 走看看