java单例模式(详)

单例模式的应用场景

单例模式的优点

饿汉懒汉

复制代码
1.所谓单例模式,就是采取一定个方法保证整个软件系统中,对某个类只能存在一个对象实例。
2.实现:饿汉式,懒汉式
3.区分懒汉式和饿汉式
饿汉式:
    坏处:加载时间过长。
    好处:饿汉式是线程安全的。
懒汉式:
    好处:延迟对象创建。
    坏处:懒汉式是线程不安全的。(使用同步机制可以将懒汉式改为线程安全的)

饿汉模式

饿汉式:不管用不用,先造。

java 复制代码
public class SingletonTest1 {
    public static void main(String[] args) {
        Bank bank1 = Bank.getInstance();
        Bank bank2 = Bank.getInstance();
        System.out.println(bank1==bank2);//true


    }
}
//饿汉式:不管用不用,先造。
class Bank{
    //1.私有化类的构造器:为了避免外部创建对象
    private Bank(){}
    //2.内部创建类的对象
    //4.要求此对象也是静态的
    private static Bank instance = new Bank();
    //3.提供公共的方法,返回类的对象
    public static Bank getInstance(){
        return instance;
    }
}

线程安全的懒汉模式

懒汉式:不用不造,用了再造

java 复制代码
public class BankTest1 {
}
//线程安全的懒汉式
class Ban{
    private Ban(){}
    private static Ban instance = null;
    public static synchronized Ban getInstance(){
        //方式一:效率低
//        if (instance == null){//第一个线程进入进入之后,创建了对象。那么在之后进入的线程,if判断为false,不创建新的对象。
//            instance = new Ban();
//        }
//        return  instance;
        //方式二:效率更高
        if(instance == null){//可能有多个线程进入,所以下面的判断不能够省略
            synchronized (Ban.class){
                if (instance == null){
                    instance = new Ban();
                }
            }
        }
        return instance;
    }
}

线程不安全的懒汉模式(不使用线程不安全的)

java 复制代码
public class SingletonTest2 {
    public static void main(String[] args) {
        Order order1 = Order.getInstance();
        Order order2 = Order.getInstance();
        System.out.println(order1 == order2);//true
    }
}
//懒汉式:不用不造,用了再造
class Order{
    //1.私有化类的构造器
    private Order(){}
    //2.声明当前类的对象,没有初始化
    //4.此对象必须声明为static
    private static Order instance = null;
    //3.声明public、static返回当前类对象的方法
    public static Order getInstance(){
        if(instance == null){
            instance = new Order();
        }
        return instance;
    }

}
相关推荐
Wang's Blog18 分钟前
Java 接入Redis: 五大数据类型与存储结构选型
java·服务器·redis
Wang's Blog22 分钟前
Java 接入Redis: 字符串与哈希类型操作命令
java·服务器·redis
智慧物业老杨5 小时前
物业数字化落地思考:真正的转型,是底层数据秩序的重构
java·大数据·人工智能·微服务·系统架构
星空7 小时前
金蝶苍穹build.gradle配置
java·build.gradle
C++ 老炮儿的技术栈9 小时前
我们在设计tcp协议时,要传一个字符串过去,报文:头十长度十内容,是否要把‘\0‘也填入,长度是否包含‘\0‘
开发语言·数据结构·c++·mfc·c
传奇开心果编程9 小时前
【Rust入门练中学】第2课:变量、可变性与常量
开发语言·学习·rust
zr想努力10 小时前
从0开始配置Perforce4环境
开发语言
步行cgn10 小时前
Spring 基于 XML 的自动装配:byName 详解
java·后端·spring
大帅点兵11 小时前
Apache Ant 1.9.9 完整讲解
java
幸运小圣11 小时前
PointerEvent 常用属性与事件整理【JavaScript】
开发语言·javascript·ecmascript