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文件被加载的时候,就会被初始化,天生线程安全。

  • 相关阅读:
    原来这样就可以开发出一个百万量级的Android相机
    微信读书这样排版,看过的人都很难忘!
    AI小白快上车!这是发往高薪职位的车!
    短视频APP是如何开启你的美好生活的?
    自从我这样撸代码以后,公司网页的浏览量提高了107%!
    如果想成为一名顶尖的前端,这份书单你一定要收藏!
    老板今天问我为什么公司的数据库这么烂,我是这样回答的......
    MapReduce Notes
    HDFS Architecture Notes
    BloomFilter
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13309485.html
Copyright © 2011-2022 走看看