Java设计模式之单例模式

本文详细介绍了单例模式的概念、特点和实现方式,包括饿汉式(急切式)和懒汉式的区别,以及如何通过双重检索和volatile关键字确保懒汉式单例模式的线程安全。此外,还提到了Runtime类作为JavaSE中的单例模式实例,以及指令重排在并发编程中的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、单例模式

单例模式的特点:

单例模式的结构:

二、单例模式实现方式

饿汉式:

懒汉式:

懒汉式单例模式怎样保证线程安全呢?

三、Runtime类

Runtime类就是JavaSE中典型的单例模式。

四、指令重排


一、单例模式

单例模式(Singleton Pattern)是Java中最简单的设计模式之一,属于创建型模式,它提供了一种创建对象的最佳方式。

使一个类在一个程序中只能创建一个对象。例如:widows任务资源管理器窗口,只需要创建一个,这样可以避免打开多个任务管理器而造成的内存资源浪费,或者出现各个窗口显示的不一致等错误。

单例模式的特点:

1.单例类只有一个实例对象;

2.该单例对象必须由单例类自行创建;

3.单例类对外提供一个访问该单例的全局访问点;

单例模式的结构:

单例类:包含一个实例且能自行创建这个实例的类。

访问类:使用单例的类。其结果如图所示:

二、单例模式实现方式

1..饿汉式单例模式(急切式):在类加载时就把唯一的单例对象创建好了。不存在线程安全问题。

2..懒汉式单例模式:在类加载时不会创建单例对象,在第一次获取单例对象时才创建,存在线程安全。

饿汉式:

先创建一个单例类,再进行测试

/*饿汉式单例模式(急切)在类加载时就把唯一的单例模式创建。不存在线程安全问题·*/
public class WindowDemo {
    static WindowDemo windowDemo = new WindowDemo();

    //构造方法私有发,要不会在外面new
    private   WindowDemo(){

    }

    public static WindowDemo getWindowDemo() {
        return windowDemo;
    }
}
public class Test {
    public static void main(String[] args){
        System.out.println(WindowDemo.getWindowDemo());
        System.out.println(WindowDemo.getWindowDemo());
        System.out.println(WindowDemo.getWindowDemo());
    }
}

运行结果:

该结果表明单例模式只创建了一个对象。

懒汉式:

package com.ffyc.javapro.javaoopdesign.design.singleton.demo2;

/*懒汉式单例模式:在类加载时就不会单例模式创建,在第一次获取单例对象时才创建存在线程安全问题·
* 解决线程安全问题方法:双重检索+volatile*/
public class WindowDemo {
    static volatile WindowDemo windowDemo ;

    //构造方法私有发,要不会在外面new
    private WindowDemo(){

    }
/*在并发量大的时候,多个线程来,会创建多个对象*/
   /* public static WindowDemo getWindowDemo() {
        if(windowDemo==null){
             windowDemo = new WindowDemo();
        }
        return windowDemo;
    }*/
/*在门里面加一般锁,后面的线程还回来效率低*/
  /*  public static WindowDemo getWindowDemo() {
        synchronized (WindowDemo.class){
            if(windowDemo==null){
                 windowDemo = new WindowDemo();
            }
        }
        return windowDemo;
    }*/

    public static WindowDemo getWindowDemo() {
        if(windowDemo==null){
            synchronized (WindowDemo.class){
                if(windowDemo==null){
                   windowDemo = new WindowDemo();
                }
            }
        }
        return windowDemo;
    }
}

测试结果:

懒汉式单例模式怎样保证线程安全呢?

使用双重检索+volatile

volatile关键字可以防止指令重排,这样就会防止多个线程进入程序,创建多个对象。

三、Runtime类

Runtime类就是JavaSE中典型的单例模式。

利用Runtime类可以启动新的进程或相关运行时环境的操作。比如,取得内存空间以及释放内存空间。

四、指令重排

参考文章:指令重排与半初始化状态-优快云博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值