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
    	}
  • 相关阅读:
    基于比较的算法之五:堆排序
    顺序统计:寻找序列中第k小的数
    顺序统计:寻找序列中的最大最小数
    非基于比较的排序算法之一:计数排序
    基于比较的算法之四:快速排序
    基于比较的算法之三:插入排序
    基于比较的算法之二:选择排序
    基于比较的算法之一:冒泡排序
    轮廓问题/Outline Problem-->改进的算法及时间复杂度分析
    寻找最大连续子序列/Find the max contiguous subsequence
  • 原文地址:https://www.cnblogs.com/yangang2013/p/5706048.html
Copyright © 2011-2022 走看看