zoukankan      html  css  js  c++  java
  • 单例模式之懒汉式和饿汉式

    什么是单例模式?

    单例模式就是在JVM中一个对象只能有一个实例。

    单例模式有七种写法,常见的单例模式有两种:懒汉式、饿汉式

    什么是懒汉式?

    就是需要的才会去实例化,线程不安全。

    什么是饿汉式?

    就是当class文件被加载的时候就已经初始化,天生线程安全。

    懒汉式写法

    /**
     * 保证这个类在JVM中只有一个实例化对象
     */
    class Singleton{
    	private static Singleton singleton;	
    	
    	//怎样解决不让无限new的问题?让构造函数私有化
    	//但是这样有一个缺点:反射不能在通过构造函数初始化了
    	private Singleton() {
    		
    	}
    	 /*
    	  * 懒汉式就是当你需要的时候才会被实例化,之后用的都是同一个实例
              * 但是懒汉式线程不安全,当两个线程同时执行getSingleton方法时,可能会new两个 
              * Singleton,违背了单例的原则
    	  * 会发生线程不安全问题,所以需要加上同步
    	  */
    	static public Singleton getSingleton() {
    		if(singleton==null) {
    			synchronized (Singleton.class) {
    				singleton=new Singleton();
    			}
    		}
    		return singleton;
    	}
    }
    
    public class SingletonTest {
    	public static void main(String[] args) {
    		Singleton singleton1=Singleton.getSingleton();
    		Singleton singleton2=Singleton.getSingleton();
    		//为true,说明两者是同一个实例
    		System.out.println(singleton1==singleton2);
    	}
    }

    饿汉写法

    /**
     * 饿汉式:就是当class文件被加载的时候,就会被初始化,天生线程安全
     */
    class Singleton1{
    	//用final修饰后,只能被初始化一次,以后不能再被更改
    	private static final Singleton1 singleton1=new Singleton1();
    	
    	private Singleton1() {
    		
    	}
    	
    	static public Singleton1 getSingleton() {
    		return singleton1;
    	}
    }
    
    public class SingletonTest2 {
    	public static void main(String[] args) {
    		Singleton1 singleton1=Singleton1.getSingleton();
    		Singleton1 singleton2=Singleton1.getSingleton();
                    //为true,说明两者是同一个实例
    		System.out.println(singleton1==singleton2);
    	}
    }

    总结:

    懒汉式就是当你需要使用的时候才会被初始化,之后都是用一个实例,但是线程不安全,需要使用synchronized进行同步。

    饿汉式就是当class文件被加载的时候,就会被初始化,天生线程安全。

  • 相关阅读:
    rsync同步公网yum源搭建本地yum仓库
    为smokeping添加日志开启debug
    python中if __name__ == '__main__':的作用
    使用telnet访问百度
    RRDtool绘制lvs连接数图形
    HTML表格
    ip netns
    redis动态扩展内存
    route命令
    设置nginx日志滚动
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13309485.html
Copyright © 2011-2022 走看看