文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

不是我看不起你?我猜你只知道两种单例模式

2024-12-02 04:56

关注

使用场景

单例模式八种方式

饿汉式(静态常量)


public class Singleton1 {
// 私有化构造方法
private Singleton1(){}

// 静态常量
private static final Singleton1 singleton1 = new Singleton1();

// 对外提供公共方法
public static Singleton1 getSingleton1(){
return singleton1;
}
}

分析

饿汉式(静态代码块)


public class Singleton2 {
// 私有化构造方法
private Singleton2(){}

private static final Singleton2 singleton2;

// 静态代码块
static {
singleton2 = new Singleton2();
}

// 对外提供公共方法
public static Singleton2 getSingleton2(){
return singleton2;
}
}

分析

懒汉式(线程不安全)


public class Singleton3 {
// 私有化构造方法
private Singleton3(){}

// 内部属性
private static Singleton3 singleton3;

// 对外提供公共方法
public static Singleton3 getSingletons(){
if(singleton3 == null){
singleton3 = new Singleton3();
}
return singleton3;
}
}

分析

懒汉式(同步方法)


public class Singleton4 {
// 私有化构造方法
private Singleton4(){}

// 内部属性
private static Singleton4 singleton4;

// 对外提供公共方法
public static synchronized Singleton4 getSingleton4(){
if(singleton4 == null){
singleton4 = new Singleton4();
}
return singleton4;
}
}

分析

懒汉式(同步代码块)


public class Singleton5 {
// 私有化构造方法
private Singleton5(){}

// 内部属性
private static Singleton5 singleton5;

// 对外提供公共方法
public static Singleton5 getSingleton5(){
if (singleton5 == null){
synchronized (Singleton5.class){
singleton5 = new Singleton5();
}
}
return singleton5;
}
}

分析

双重检查锁方式


public class Singleton6 {
// 私有化构造方法
private Singleton6(){}

// 内部属性
private volatile static Singleton6 singleton6;

// 对外提供公共方法
public static Singleton6 getSingleton6(){
if (singleton6 == null){
synchronized (Singleton6.class){
if(singleton6 == null){
singleton6 = new Singleton6();
}
}
}
return singleton6;
}
}

分析

静态内部类方式


public class Singleton7 {
// 私有化构造方法
private Singleton7(){}

// 内部类
private static class SingleInstance{
public static final Singleton7 singleton7 = new Singleton7();
}

// 对外提供公共方法
public static Singleton7 getSingleton7(){
return SingleInstance.singleton7;
}
}

分析

枚举方式

定义单例对象


public class Singleton {

public void hello(){
System.out.println("hello");
}
}

定义枚举实例化单例对象


enum Singleton8 {
// 相当于public static final Singleton8 INSTANCE;
// 保证了枚举实例只能被实例化一次
INSTANCE;

// 定义单例变量
private Singleton singleton;

// 枚举构造方法,该构造方法是private,执行构造方法的时候,同时创建我们的单例对象
Singleton8() {
singleton = new Singleton();
}

// 对外提供公共方法
public Singleton getSingleton() {
return singleton;
}
}

使用方法

Singleton8.INSTANCE.getSingleton()即可获取我们的单例对象了。

分析

总结

单例模式保证了系统内存中该类只存在一个对象,节省了系统资源,对于一些需要频繁创建销毁的对象, 使用单例模式可以提高系统性能

当想实例化一个单例类的时候,必须要记住使用相应的获取对象的方法,而不是使用new

单例模式推荐使用的方法有内部静态类方式和枚举方式

来源:今日头条内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯