美文网首页
java单例模式

java单例模式

作者: 请不要酱紫 | 来源:发表于2018-10-17 11:43 被阅读0次
    • 概念
         单例模式:单例模式核心只需要new一个实例对象的模式,比如数据库连接,在线人数等,一些网站上看到的在线人数统计就是通过单例模式实现的,把一个计时器存放在数据库或者内存中,当有人登陆的时候取出来加一再放回去,有人退出登陆的时候取出来减一再放回去,但是当有两个人同时登陆的时候,会同时取出计数器,同时加一,同时放回去,这样的话数据就会错误,所以需要一个全局变量的对象给全部人使用,只需要new出一个实例对象,这就是单例模式的应用,并且单例模式节省资源,因为它控制了实例对象的个数,并有利于gc回收。

    • 实现代码

    懒汉式方式

    public class Singleton{
    
        private Singleton(){}
    
        private static Singleton singleton = null;  //不建立对象
    
        public static synchronized Singleton getInstance(){
    
                 if(singleton == null) {        //先判断是否为空                
    
                     singleton = new Singleton ();  //懒汉式做法
    
                 }
    
                 return singleton ;
    
         }
    
    }
    

    饿汉式方式

    public class Singleton{
    
        public Singleton(){}
    
        private static Singleton singleton = new Singleton();  //建立对象
    
        public static Singleton getInstance(){
    
            return singleton ;//直接返回单例对象    
      }
    }
    
    • 缺点
         懒汉式方式在多线程中存在安全问题,如果多线程同时请求创建对象,可能会创建出多个对象,若加上同步锁又会影响性能。而饿汉式方式对于创建单例对象很慢时,那么在jvm加载类时,如果其他地方使用到这个对象,那么就会初始化这个单例变量,可能会花费很多时间。

    • 使用内部静态类优化单例模式

    public class StaticInnerSingleton {
    
        private StaticInnerSingleton() {
            if (SingletonHolder.instance != null) {
                throw new IllegalStateException();
            }
        }
    
        private static class SingletonHolder {
            private static StaticInnerSingleton instance = new StaticInnerSingleton();
        }
    
        public static StaticInnerSingleton getInstance() {
            return SingletonHolder.instance;
        }
    
    }
    
    

    相关文章

      网友评论

          本文标题:java单例模式

          本文链接:https://www.haomeiwen.com/subject/ryblzftx.html