在面试的过程中,很多公司常考察单例模式,并且需要手写代码。
单例模式的特点:
1、单例类只能有一个实例。2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
第一种:懒汉式单例模式
- //懒汉式单例类.在第一次调用的时候实例化自己
- public class Singleton {
- //私有的默认构造子
- private Singleton() {}
- //注意,这里没有final
- private static Singleton single=null;
- //静态工厂方法
- public static Singleton getInstance() {
- if (single == null) {
- single = new Singleton();
- }
- return single;
- }
- }
Singleton通过将构造方法限定为private避免了类在外部被实例化,在同一个虚拟机范围内,Singleton的唯一实例只能通过getInstance()方法访问。但是,通过Java反射机制是能够实例化构造方法为private的类的,那基本上会使所有的Java单例实现失效。而且,它是线程不安全的。如果要把懒汉式用于多线程,有两种方式保证安全性,一种是在getInstance方法上加同步,另一种是在使用该单例方法前后加双锁。
第二种:饿汉式单例模式
- //饿汉式单例类.在类初始化时,已经自行实例化
- public class Singleton1 {
- //私有的默认构造子
- private Singleton1() {}
- //已经自行实例化
- private static final Singleton1 single = new Singleton1();
- //静态工厂方法
- public static Singleton1 getInstance() {
- return single;
- }
- }
饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以是线程安全的。