码迷,mamicode.com
首页 > 其他好文 > 详细

单例模式的几种常见写法

时间:2019-10-07 18:02:13      阅读:79      评论:0      收藏:0      [点我收藏+]

标签:get   空间   多个实例   利用   stat   nbsp   调用   外部   它的   

第一种:最简单的写法,缺点在于实例在类初始化的时候就创建了,如果在整个项目中都没有使用到该类,就会创建内存空间的浪费。

public class Singleton {
    
    private Singleton(){}
    
    private static Singleton instance = new Singleton();
    
    public static Singleton getInstance(){
        return instance;
    }
}

第二种:解决了写法一在类初始化的时候就创建实例的问题,然而只能在单线程中使用,在多线程中使用如果多个线程同时进入if语句中,就可能出现创建多个实例的问题。

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

第三种:解决了写法二可能出现的问题,可以在多线程中使用。缺点在于synchronized关键字会强制一次只能让一个线程进入方法中,其他线程不得不阻塞等待该线程退出方法。

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

第四种:这种写法的好处是充分利用了静态内部类的特点,它的初始化操作跟外部类是分开的。在没有调用 getInstance() 方法之前,静态内部类不会进行初始化,在第一次调用该方法后就生成了唯一一个实例。

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

 

单例模式的几种常见写法

标签:get   空间   多个实例   利用   stat   nbsp   调用   外部   它的   

原文地址:https://www.cnblogs.com/duguangming/p/11631198.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!