java中的单例模式

单例模式,可以认为是java的一种写代码的模板。单例模式:设计类的对象是单一的。

包括三种:饿汉式、懒汉式、静态内部类方式

饿汉式的代码示例:

复制代码
public class Student {
    //类加载时就创建实例
    public static final Student stu = new Student();

    //私有化构造方法
    private Student(){
    }
    //全局访问点
    public static Student getStu(){
        return stu;
    }
}

饿汉式是在加载类的时候就会创建实例,优点是:实现简单 缺点就是会一直占用资源、浪费资源。

注:全局访问点相当于一个统一的入口,程序中任何类、方法都能调用,并且最后确保返回同一个实例。

懒汉式的代码:只有真正需要实例的时候才会创建对象,而不是加载类时就创建

复制代码
public class Student2 {
    private static Student2 stu;
    
    //私有化构造方法
    private Student2(){
        
    }
    //获取对象
    public static Student2 getStu(){
        //Student2.class表示当前类的Class对象 
        // 每个类都有唯一的Class对象 这里面是synchronized需要的监听器必须是唯一的
        if(stu == null){
            synchronized (Student2.class){
                if(stu == null){
                    stu = new Student2(); //调用时才创建
                }
            }
        }
        return stu;
    }
}

注意:这里用到了双重检查锁定 可以提高效率

第一次检查 如果实例已经存在可以直接返回,避免不必要的加锁,如果不存在才会进入同步代码块来保证只有一个线程能创建实例。

第二次检查的目的是:防止多个线程同时通过第一次检查后,重复创建实例

静态内部类的方式:

复制代码
public class Student3 {
    //静态内部类
    private static class Handle{
        //在内部类中创建外部类的实例
        static Student3 stu = new Student3();
    }
    //私有化构造方法
    private Student3(){
    }
    public static Student3 getStu(){
        return Handle.stu;//触发内部类的加载
    }
}

只有调用getStu()才会创建实例。

静态内部类的进程:static Student3 stu = new Student3(); JVM的类加载机制本身就是线程安全的 不需要手动加锁。

假如线程A和线程B同时调用getStu(),线程A执行return Handle.stu ,JVM发现handle类还没加载,就会加载handle类,执行静态初始化。此时线程B执行return Handle.stu,JVM发现handle类正在被加载(线程A持有锁),线程B则会等待,只有A完成加载释放锁后,才会接着执行。

相关推荐
mldong7 小时前
给若依加审批流,不用 Flowable
java·spring boot·架构
Wang's Blog9 小时前
Java框架快速入门: Spring Security+OAuth2之数据库和实体类的RBAC改造
java·数据库·spring
讳疾忌医丶9 小时前
深度拆解 RocksDB 内核:基于 C++17 的 FIFO 调度状态机与温度阶梯自愈设计
java·c++·算法·架构
lsswear9 小时前
Python 并发 线程
开发语言·python
郑州光合科技余经理9 小时前
国际版外卖系统:税率字段怎么和订单主流程解耦
android·java·开发语言·前端·后端·php·ai编程
毅炼9 小时前
Rover-Suite 开源发布:轻量服务注册中心与网关一体化方案
java·后端·系统架构·gateway
软件课代表CiCi10 小时前
运行库是什么?电脑缺运行库怎么办?c++运行库缺失修复全攻略
开发语言·c++·windows·电脑·dll修复·dll丢失·运行库
梦想平凡10 小时前
百游棋牌源代码开发搭建教程(十):隔离部署、备份恢复与双端验收
java·前端·javascript·数据库·源代码管理
Ivanqhz10 小时前
MLIR OpBuilder
开发语言·python·mlir
sunshine22 girl11 小时前
Idea中如何搜索
java·ide·intellij-idea