单例模式
发布日期:2021-05-08 12:13:17 浏览次数:20 分类:精选文章

本文共 1438 字,大约阅读时间需要 4 分钟。

一、懒汉式单例模式

懒汉式单例模式通过将单例对象的初始化延迟到第一次使用时完成,能够在大多数情况下减少内存占用,尤其适用于资源有限的环境。为了保证线程安全,懒汉式通常会在newInstance方法中使用sync关键字进行加锁。

package com.ed.singleton;public class Singleton {    private static Singleton singleton; // 单例对象    private Singleton() { // 私有构造函数,防止外部new创建    }    public static Singleton newInstance() {        synchronized (singleton) { // 使用synchronized确保线程安全            if (singleton == null) {                singleton = new Singleton();            }        }        return singleton;    }}

这种实现方式在单线程环境下表现优异,但在多线程环境下可能会导致多个线程同时进入newInstance方法,从而导致并发访问问题。


二、饿汉式单例模式

饿汉式单例模式通过立即初始化单例对象,确保在任何情况下都能快速访问单例实例。这种方式可以避免线程安全问题,但可能会因为提前创建对象而带来内存资源的浪费。

package com.ed.singleton;public class Singleton2 {    private static Singleton2 singleton = new Singleton2(); // 单例对象在类加载时就初始化    private Singleton2() { // 私有构造函数,防止外部new创建    }    public static Singleton2 newInstance() {        return singleton;    }}

饿汉式的优点在于简单且高效,适用于对线程安全要求不高的场景。


三、Holder单例模式

Holder单例模式结合了懒汉式和饿汉式的优点,通过使用静态内部类的机制实现了延迟加载和线程安全。这种方式不仅保证了单例对象的唯一性,还可以避免外部代码误操作导致的内存泄漏。

package com.ed.singleton;public class Singleton4 {    // 静态内部类用于延迟初始化    private static class LazyHolder {        private static final Singleton4 instance = new Singleton4(); // 延迟初始化单例对象    }    private Singleton4() { // 私有构造函数,防止外部new创建    }    public static final Singleton4 getInstance() {        return LazyHolder.instance; // 通过静态访问方式获取单例实例    }}

这种实现方式通过JVM的静态初始化机制,确保了单例对象的线程安全,同时延迟了对象的初始化,减少了内存开销。

上一篇:Java并发——Synchronized关键字和锁升级,详细分析偏向锁和轻量级锁的升级
下一篇:mysql锁知识笔记

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2025年04月25日 19时00分42秒