zoukankan      html  css  js  c++  java
  • Java中两种单例模式小结

    概念:

    保证一个类仅有一个实例,并提供一个访问它的全局访问点。


    以前我们的做法是设置一个全局变量,也就是让它使得一个对象被访问。但是它不能防止你实例多个对象。这时我们可以让类自身负责保存它的唯一实例,这个类可以保证没有其他实例可以被创建,并且提供一个访问该实例的方法。


    通过上面的描述,我们可以看到单例模式有以下特点:
    1、单例类只能有一个实例。
    2、单例类必须自己自己创建自己的唯一实例。

    3、单例类必须给所有其他对象提供这一实例。


    因此,创建一个类的实例的具体方法(要素)是:
          1、 私有的、静态的成员变量
          2、 私有的构造方法
          3、 公共的、静态的一个入口方法

    根据上面的具体方法,我们来看一下下面的代码

    public class Test {
    	private static Test instance = new Test ();	
    	
    	private Test (){
    	
    	}
    	
    	public static Test GetInstance(){
    		return instance;
    	}
    }
    


    从上面的代码中我们看出,当类加载到内存时,在我们调用GetInstance()方法之前,就已经在内存中创建了一个instance对象。也就是说,不管我是否想用这个方法,在内存中就已经存在instance这个对象了,此时这个对象就是多余对象了,这样就会占用内存资源。因此我们将这种单例模式称作“饿汉式”单例模式。其实就是一个“预加载”的过程。


    而“懒汉式”单例模式(也就是“延迟式”创建对象)则是在我们需要的时候才去创建这个对象。这样就避免了提前创建对象占用内存资源。


    public class Test {
    	private static Test instance = null;
    	
    	private Test (){
    		
    	}
    	public static Test getInstance(){
    		if (instance == null) then {
    			instance = new Test ();
    		}
    		return instance;
    	}
    }
    


    但是,通过观察上面的代码,我们可以看出其中还是存在一些问题的。假设,有多个进程同时调用getInstance()方法,这样就可能出现同时创建多个对象,那这就不是单例模式了。因此,我们可以加入“同步”这个关键字使得我们的代码更加的严谨。改进之后是这样的


    public class Test {
    	private static Test instance = null;
    	
    	private Test (){
    		
    	}
    	public static synchronized Test getInstance(){
    		if (instance == null) then {
    			instance = new Test ();
    		}
    		return instance;
    	}
    }
    







  • 相关阅读:
    leetcode 33. Search in Rotated Sorted Array
    leetcode 32. Longest Valid Parentheses
    leetcode 28. Implement strStr()
    leetcode 27. Remove Element
    leetcode 26. Remove Duplicates from Sorted Array
    leetcode 24. Swap Nodes in Pairs
    leetcode 22. Generate Parentheses
    树莓派的频率管理和热控制
    sql执行insert插入一条记录同时获取刚插入的id
    全程直播个人博客重构过程,采用springboot+dubbo+jpa技术栈。
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3013852.html
Copyright © 2011-2022 走看看