java单例模式

  • 概念
       单例模式:单例模式核心只需要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单例模式)