您的位置:

5分钟搞定java单例模式的简单介绍

本文目录一览:

java 单例模式

System.out.println (Singleton.getInstance());

System.out.println (Singleton.getInstance());

main 函数中有这两句,一摸一样。

第一句执行的时候,第一次调用getInstance(),意思是要获取Singleton的一个对象实例。

而正常情况下,我们要获取对象的话是用 new Singleton(),这个方法的,但是这个方法在Singleton里面被声明为:private ,意思是外界不能调用。

不能调用,我怎么用你的对象?

Singleton里面实现了生成对象的方法,getInstance(),你要用他的对象就必须调用这个方法。

而这个方法里面你也看到了,如果

if(instance == null){

instance = new Singleton();

}

如果没有实例则创建一个新的,但是已经创建过的话,就返回已经存在的实例。

所以输出结果:

net.chelson.chapter5.Singleton@de6ced

net.chelson.chapter5.Singleton@de6ced

你两次调用的这个对象的内存地址都是相同的,也就是说,是同一个东西(对象)

这个总的来说就是:

类的构造方法私有化(防止外界构造新对象)

提供获取实例的方法(用于外界调用)

作用:用于提供只能有一个实例的对象。

如何在Java中实现单例模式?

单例模式大致有五种写法,分别为懒汉,恶汉,静态内部类,枚举和双重校验锁。

1、懒汉写法,常用写法

class LazySingleton{

    private static LazySingleton singleton;

    private LazySingleton(){

    }

    public static LazySingleton getInstance(){

        if(singleton==null){

            singleton=new LazySingleton();

        }

        return singleton;

    }   

}

2、恶汉写法,缺点是没有达到lazy loading的效果

class HungrySingleton{

    private static HungrySingleton singleton=new HungrySingleton();

    private HungrySingleton(){}

    public static HungrySingleton getInstance(){

        return singleton;

    }

}

3、静态内部类,优点:加载时不会初始化静态变量INSTANCE,因为没有主动使用,达到Lazy loading

class InternalSingleton{

    private static class SingletonHolder{

        private final static  InternalSingleton INSTANCE=new InternalSingleton();

    }   

    private InternalSingleton(){}

    public static InternalSingleton getInstance(){

        return SingletonHolder.INSTANCE;

    }

}

4、枚举,优点:不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象

enum EnumSingleton{

    INSTANCE;

    public void doSomeThing(){

    }

}

5、双重校验锁,在当前的内存模型中无效

class LockSingleton{

    private volatile static LockSingleton singleton;

    private LockSingleton(){}

     

    //详见:

    public static LockSingleton getInstance(){

        if(singleton==null){

            synchronized(LockSingleton.class){

                if(singleton==null){

                    singleton=new LockSingleton();

                }

            }

        }

        return singleton;

    }

}

参考自:

java怎么实现单实例运行

Java实现单例的5种方式

1. 什么是单例模式

单例模式指的是在应用整个生命周期内只能存在一个实例。单例模式是一种被广泛使用的设计模式。他有很多好处,能够避免实例对象的重复创建,减少创建实例的系统开销,节省内存。

2. 单例模式和静态类的区别

首先理解一下什么是静态类,静态类就是一个类里面都是静态方法和静态field,构造器被private修饰,因此不能被实例化。Math类就是一个静态类。

知道了什么是静态类后,来说一下他们两者之间的区别:

1)首先单例模式会提供给你一个全局唯一的对象,静态类只是提供给你很多静态方法,这些方法不用创建对象,通过类就可以直接调用;

2)单例模式的灵活性更高,方法可以被override,因为静态类都是静态方法,所以不能被override;

3)如果是一个非常重的对象,单例模式可以懒加载,静态类就无法做到;

那么时候时候应该用静态类,什么时候应该用单例模式呢?首先如果你只是想使用一些工具方法,那么最好用静态类,静态类比单例类更快,因为静态的绑定是在编译期进行的。如果你要维护状态信息,或者访问资源时,应该选用单例模式。还可以这样说,当你需要面向对象的能力时(比如继承、多态)时,选用单例类,当你仅仅是提供一些方法时选用静态类。