温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java单例模式的线程安全实现

发布时间:2024-09-29 19:22:28 来源:亿速云 阅读:82 作者:小樊 栏目:编程语言

在Java中,单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点。为了确保线程安全,我们可以使用以下几种方法来实现单例模式:

  1. 懒汉式 + 双重检查锁定(DCL)
public class Singleton {
    private static volatile Singleton instance;

    private Singleton() {
    }

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

这里使用了双重检查锁定(DCL),首先检查实例是否为null,如果为null,则进入同步块。在同步块内部再次检查实例是否为null,如果仍然为null,则创建实例。使用volatile关键字确保多线程环境下的可见性。

  1. 饿汉式
public class Singleton {
    private static final Singleton instance = new Singleton();

    private Singleton() {
    }

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

饿汉式单例模式在类加载时就创建实例,因此是线程安全的。但是,这种方式可能会浪费资源,因为实例在类加载时就被创建,而不管是否真的需要使用它。

  1. 静态内部类
public class Singleton {
    private Singleton() {
    }

    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

静态内部类单例模式利用了Java类加载机制,只有在调用getInstance()方法时才会加载SingletonHolder类并创建实例。这种方式既保证了线程安全,又避免了资源浪费。

  1. 枚举
public enum Singleton {
    INSTANCE;

    // 其他方法
}

枚举单例模式是线程安全的,因为Java枚举类型的实例在类加载时就被创建,并且每个枚举类型都是单例。但是,枚举类型只能表示固定的几个实例,不适合表示大量实例的场景。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI