单例模式实现

简介: 1. 单线程可用 2. 使用final常量 3. 加锁构造 4. 方法级加锁 5. 静态内部类实现,多线程可用 6. 拒绝强行反射创建我

1. 单线程可用

public class Singleton {

    private static Singleton singleton;

    private Singleton() {
    }

    public static Singleton getInstance() {
        if (null == singleton) {
            singleton = new Singleton();
        }
        return singleton;
    }
}

2. 使用final常量

public class Singleton {

    private static final Singleton singleton = new Singleton();

    private Singleton() {
    }

    public static Singleton getInstance() {
        return singleton;
    }
}

3. 加锁构造

public class Singleton {

    private static Singleton singleton;

    private static final Lock LOCK = new ReentrantLock();

    private Singleton() {
    }

    public static Singleton getInstance() {
        if (null == singleton) {
            LOCK.lock();
            if (null == singleton) {
                singleton = new Singleton();
            }
            LOCK.unlock();
        }
        return singleton;
    }
}

4. 方法级加锁

public class Singleton {

    private static Singleton singleton;

    private Singleton() {
    }

    public static Singleton getInstance() {
        if (null == singleton) {
            init();
        }
        return singleton;
    }

    private static synchronized void init(){
        if(null == singleton){
            singleton = new Singleton();
        }
    }
}

5. 静态内部类实现,多线程可用

public class Singleton {

    private Singleton() {
    }

    public static Singleton getInstance() {
        return Container.singleton;
    }

    private static class Container {
        private static Singleton singleton = new Singleton();
    }
}

6. 拒绝强行反射创建我

public class Singleton {

    private Singleton() {
        if (null != Container.singleton) {
            throw new UnsupportedOperationException(); // 报错啦
        }
    }

    public static Singleton getInstance() {
        return Container.singleton;
    }

    private static class Container {
        private static Singleton singleton = new Singleton();
    }
}
目录
相关文章
|
2月前
|
C++
C++单例模式
C++中使用模板实现单例模式的方法,并通过一个具体的类A示例展示了如何创建和使用单例。
33 2
|
设计模式 安全 Java
单例模式的运用
单例模式的运用
46 0
找对象需要单例模式吗?
单例模式的类只提供私有的构造函数
|
SQL 安全 Java
五种单例模式介绍
五种单例模式介绍
94 0
|
设计模式 缓存 JSON
没那么简单的单例模式
没那么简单的单例模式
127 0
没那么简单的单例模式
|
存储 安全 调度
单例模式的简单介绍
单例模式的简单介绍
|
设计模式 安全 前端开发
关于单例模式,你应该了解这些
关于单例模式,你应该了解这些
关于单例模式,你应该了解这些
|
设计模式 安全 Java
回顾一下单例模式
回顾一下单例模式
|
设计模式 缓存
我学会了,单例模式
单例模式属于创建型模式,这个类型的设计模式是将 对象的创建和使用解耦了,花式的去创建对象。
130 0
我学会了,单例模式
|
设计模式 数据库 Python