博客
关于我
java单例模式
阅读量:794 次
发布时间:2023-01-28

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

单例模式实践探索

1. 第一个理解:什么是单例模式

单例模式是一个设计模式,确保一个类在程序中只能有一个实例。其他所有请求都将返回这个唯一实例。这样可以提高性能和防止内存泄漏。

2. 实现懒汉式单例

懒汉式的特点是只有当需要时才创建实例。这种方式在第一次需要实例时进行初始化,这样可以减少资源浪费。

public class SingletonStudent {    private static SingletonStudent student = null;    private String name;    private int age;    private SingletonStudent() {        // 私有化构造    }    public static synchronized SingletonStudent getInstance() {        if (student == null) {            // 双重锁确保线程安全            synchronized (SingletonStudent.class) {                if (student == null) {                    student = new SingletonStudent();                }            }        }        return student;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }}

3. 饿汉式单例的实现

饿汉式会在定义类的时候创建实例,保证无论何时都有一份实例,减少了大量需求时的崩溃可能性。

public class SingletonStudent2 {    private static SingletonStudent2 student = new SingletonStudent2();    private String name;    private int age;    private SingletonStudent2() {        // 私有化构造    }    public static synchronized SingletonStudent2 getInstance() {        return student;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }}

4. 双重锁单例实现

双重锁确保在高并发环境下也能线程安全地管理单例实例,保证多次访问只会创建一个实例。

public class SingletonStudent3 {    private static SingletonStudent3 student = null;    private String name;    private int age;    private SingletonStudent3() {        // 私有化构造    }    public static synchronized SingletonStudent3 getInstance() {        if (student == null) {            synchronized (SingletonStudent3.class) {                if (student == null) {                    student = new SingletonStudent3();                }            }        }        return student;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }}

5. 测试验证

通过在测试类中创建单例对象,设置不同的年龄和姓名,然后验证实例是否一致。

@Testpublic void testSingleton() {    SingletonStudent student1 = SingletonStudent.getInstance();    student1.setAge(50);    student1.setName("小黑");    SingletonStudent student2 = SingletonStudent.getInstance();    //(student1 == student2) 应为 true    System.out.println(student1 == student2);}
@Testpublic void testSingleton2() {    SingletonStudent2 student1 = SingletonStudent2.getInstance();    student1.setAge(50);    student1.setName("小黑");    SingletonStudent2 student2 = SingletonStudent2.getInstance();    //student1 == student2 应为 true    System.out.println(student1 == student2);}
@Testpublic void testSingleton3() {    SingletonStudent3 student1 = SingletonStudent3.getInstance();    student1.setAge(50);    student1.setName("小黑");    SingletonStudent3 student2 = SingletonStudent3.getInstance();    //student1 == student2 应为 true    System.out.println(student1 == student2);}

6. 总结

通过本次实践,我深入理解了单例模式的实现方式,包括懒汉式、饿汉式以及双重锁机制。未来的学习中,我将继续探索如何优化这些实现,确保在性能和线程安全之间取得平衡。此外,我也计划实践更多的设计模式,以提升面对实际项目问题的应对能力。

转载地址:http://pnryk.baihongyu.com/

你可能感兴趣的文章
flink sql设置并行度_Flink 参数配置和常见参数调优
查看>>
go 字符串替换_Go 每日一库之 quicktemplate
查看>>
hex editor neo下载_口袋妖怪爆焰黑手机版下载-口袋妖怪爆焰黑手游下载v4.3.0 安卓版...
查看>>
ICLOUD储存空间要升级吗_有人像我一样需要恢复苹果手机icloud空间ios备份时 微信卡住不动了吗(已解决)...
查看>>
jaccard相似度_自然语言处理之文本相似度计算
查看>>
java书籍_还搞不定Java多线程和并发编程面试题?你可能需要这一份书单!
查看>>
java攀枝花市房屋租售信息管理平台的设计与实现(ssm)
查看>>
java教学团队管理系统(ssm)
查看>>
java教学网站(ssm)
查看>>
java教学质量管理平台(ssm)
查看>>
java教师管理系统(ssm)
查看>>
java教师课堂助手app(ssm)
查看>>
java教研室采购管理系统(ssm)
查看>>
java教育机构管理(ssm)
查看>>
java教育辅导班信息网(ssm)
查看>>
BurpSuite实战九之使用Burp Repeater
查看>>
Ceph企业级实战
查看>>
Ceph对象存储详解
查看>>
Cisco防火墙配置实战
查看>>
DDNS动态域名无固定IPSEC配置实战
查看>>