zoukankan      html  css  js  c++  java
  • 设计模式学习--------6.单例模式学习

    单例非常简单,只说下一些值得注意的地方。


    模式一:懒汉式

    需要的时候在初始化,时间换空间,每次获取实例都去判断是否需要创建实例.非线程安全。

    package com.kris.study;
    
    public class Singleton {
        private static Singleton instance = null;
        private Singleton(){}
        public static Singleton getInstance(){
        	if(instance == null){
        		instance = new Singleton();
        	}
        	return instance;
        }
    }
    


    模式二:饿汉式

    开始就初始化,空间换时间.线程安全,在装载类时初始化,不会产生并发,因为虚拟机保证只会装载一次.

    package com.kris.study;
    
    public class Singleton {
        private static Singleton instance = new Singleton();
        private Singleton(){}
        public static Singleton getInstance(){
        	return instance;
        }
    }
    


    如何实现线程安全的懒汉模式:

    package com.kris.study;
    
    public class Singleton {
        private static Singleton instance = null;
        private Singleton(){}
        public static Singleton getInstance(){
        	if(instance == null){
        		synchronized (Singleton.class) {
    				if(instance == null)
    			       instance = new Singleton();
        		}
        	}
        	return instance;
        }
    }
    


    以上是标准的单例实现


    高手的单例解决方案:

    package com.kris.study;
    
    public class Singleton {
        private static class SingletonHolder{
        	private static Singleton instance = new Singleton();
        }
        
        private Singleton(){}
        
        public static Singleton getInstance(){
        	
        	return SingletonHolder.instance;
        }
    }
    


    当getInstance方法第一次被调用时,它第一次读取SingletonHolder.instance,导致SingletonHolder类得到初始化,而这个

    类在装载并被初始化的时候,会初始化他的静态域,从而创建Singleton实例,由于是静态域,因此在装载时才初始化一次.

    并由虚拟机来保证线程安全。而且getInstance方法没有被同步.因此不会增加额外的成本.


    单例和枚举:

    Effective JAVA中提倡用枚举实现单例

    package com.kris.study;
    
    public enum Singleton {
    	INSTANCE;
        public void singletonOperation(){
        	//功能处理
        }
    }
    





  • 相关阅读:
    Eclipse调试Java的10个技巧
    什么是POJO?
    能够提高开发效率的Eclipse实用操作
    Oracle数据库查看执行计划
    Oracle执行计划详解
    Android接收wifi路由器发送过来的一组字节数据
    Android与路由器连接服务
    Android真机连接手机Target显示unknown cmd命令下adb devices 显示offline
    绿豆沙色值多少
    如何在Eclipse中添加Servlet-api.jar的方法
  • 原文地址:https://www.cnblogs.com/krislight1105/p/3748299.html
Copyright © 2011-2022 走看看