Java实现创建模式-单例模式(饿汉式、懒汉式、双重检查锁、单例枚举)

命运对每个人都是一样的,不一样的是各自的努力和付出不同,付出的越多,努力的越多,得到的回报也越多,在你累的时候请看一下身边比你成功却还比你更努力的人,这样,你就会更有动力。

导读:本篇文章讲解 Java实现创建模式-单例模式(饿汉式、懒汉式、双重检查锁、单例枚举),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

Java实现创建模式-单例模式饿汉式、懒汉式、双重检查锁、单例枚举

前言

当我们在程序中需要确保某个类只能创建一个实例时,就需要用到单例模式。单例模式的实现方法有很多种,下面来详细解释几种不同的实现方式。

单例模式 说明
饿汉式 饿汉式是一种线程安全的单例实现方法,当类被加载时就会立即实例化,因此不存在线程安全问题。但是,由于类在加载时就会创建对象,这种方法会导致内存浪费。
懒汉式 懒汉式是一种常用的单例实现方法,它在类第一次使用时才会创建对象。但是,懒汉式并不是线程安全的,如果多个线程同时调用getInstance(),有可能会创建多个实例。
双重检查锁 双重检查锁是一种更高效的懒汉式实现方法,它使用了同步锁和双重检查来保证线程安全和性能。但是,它的实现比较复杂,还有一些潜在的问题,需要注意。
单例枚举 单例枚举是一种简单且安全的单例实现方法,它利用枚举类的特性来保证只有一个实例。这种方法不仅是线程安全的,还可以防止反射攻击和序列化问题。

总的来说单例模式是一种常用的设计模式,可以确保某个类只有一个实例,并且该实例可以被全局访问。不同的实现方法都有各自的优缺点,需要根据实际情况选择。

内容说明

单例模式解决的问题是确保一个类只有一个实例,并提供全局访问点,以避免多个对象之间的冲突和资源浪费。这种模式通常用于管理共享资源,例如数据库连接池或线程池。
本文实现了四种不同类型的单例模式:饿汉式、懒汉式、双重检查锁和枚举
为了汇总测试,通过Main方法创建两个实例来检查它们是否是同一个对象

public class testSingleton {
    public static void main(String[] args) {
        Singleton1 s1 = Singleton1.getInstance();
        Singleton1 s2 = Singleton1.getInstance();
        System.out.println(s1 == s2); // true

        Singleton2 s3 = Singleton2.getInstance();
        Singleton2 s4 = Singleton2.getInstance();
        System.out.println(s3 == s4); // true

        Singleton3 s5 = Singleton3.getInstance();
        Singleton3 s6 = Singleton3.getInstance();
        System.out.println(s5 == s6); // true

        Singleton4 s7 = Singleton4.INSTANCE;
        Singleton4 s8 = Singleton4.INSTANCE;
        System.out.println(s7 == s8); // true
    }
}

// 饿汉式单例模式
class Singleton1 {
    private static Singleton1 instance = new Singleton1();
    private Singleton1() {}
    public static Singleton1 getInstance() {
        return instance;
    }
}

// 懒汉式单例模式
class Singleton2 {
    private static Singleton2 instance;
    private Singleton2() {}
    public static synchronized Singleton2 getInstance() {
        if (instance == null) {
            instance = new Singleton2();
        }
        return instance;
    }
}

// 双重检查锁单例模式
class Singleton3 {
    private volatile static Singleton3 instance;
    private Singleton3() {}
    public static Singleton3 getInstance() {
        if (instance == null) {
            synchronized (Singleton3.class) {
                if (instance == null) {
                    instance = new Singleton3();
                }
            }
        }
        return instance;
    }
}

// 枚举单例模式
enum Singleton4 {
    INSTANCE;
}

饿汉模式

饿汉式初始化在类加载时创建单例类的实例。这确保了实例始终可用且线程安全,但如果实例不总是需要,则可能会浪费资源。

// 饿汉式单例模式
class Singleton1 {
    private static Singleton1 instance = new Singleton1();
    private Singleton1() {}
    public static Singleton1 getInstance() {
        return instance;
    }
}

懒汉模式

懒汉式初始化仅在需要时创建单例类的实例。这样可以节省资源,但如果没有同步,则不是线程安全的。

// 懒汉式单例模式
class Singleton2 {
    private static Singleton2 instance;
    private Singleton2() {}
    public static synchronized Singleton2 getInstance() {
        if (instance == null) {
            instance = new Singleton2();
        }
        return instance;
    }
}

双重检查锁

双重检查锁是懒汉式初始化的线程安全版本,它避免了在创建实例后的第一次同步。

// 双重检查锁单例模式
class Singleton3 {
    private volatile static Singleton3 instance;
    private Singleton3() {}
    public static Singleton3 getInstance() {
        if (instance == null) {
            synchronized (Singleton3.class) {
                if (instance == null) {
                    instance = new Singleton3();
                }
            }
        }
        return instance;
    }
}

枚举单例

枚举单例模式是一种简单的线程安全单例模式

// 枚举单例模式
enum Singleton4 {
    INSTANCE;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/144212.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之家——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!