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
    	}
  • 相关阅读:
    wpf arcgis engine 当前没有或未启用Spatial Analyst许可解决办法
    arcglobe 图层三大类说明
    sql自带函数语句
    wpf 前台获取资源文件路径问题
    Microsoft.Office.Interop.Excel的用法
    WPF:父窗口与子窗口的层次关系
    wpf 拖图片到窗体
    wpf comboBox取值问题
    wpf 窗体内容旋转效果 网摘
    js拖动滑块
  • 原文地址:https://www.cnblogs.com/yangang2013/p/5706048.html
Copyright © 2011-2022 走看看