首页 > 编程语言 >JAVA 设计模式(一) - 单例模式

JAVA 设计模式(一) - 单例模式

时间:2023-12-26 20:36:10浏览次数:44  
标签:Singleton JAVA private class instance static 单例 设计模式 public

JAVA 设计模式(一) - 单例模式

本篇文章主要讲下android 创建型设计模式中的单例模式.

单例模式保证一个类只有一个实例,并提供一个访问该实例的全局节点.

它的实现有多种实现方式:

1: 饿汉式

饿汉式:类加载时就创建实例 . 不支持延迟加载实例

public class Singleton {
    private static Singleton instance = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() {
        return instance;
    }
}

2: 懒汉式

懒汉式: 使用时才创建实例. **支持延迟加载 **.缺点 : getInstance 使用了 synchronize 实现线程同步,导致这个方法的并发很低,每次调用都会频繁的枷锁、释放锁

public class Singleton {
    private static Singleton instance;
    private Singleton() {}
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

3:双重校验锁

public class Singleton {
    private volatile static Singleton instance;
    private Singleton() {}
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

这里注意成员变量 instance使用了volatile 来修饰,作用就是禁止指令重排序.

指令重排是指在不改变程序执行结果的前提下,CPU为了提高程序执行效率,可能会对指令的执行顺序进行调整.

如上述代码,instance = new Singleton(); 实际执行了三步操作:

  1. 分配内存空间

  2. 初始化对象

  3. 将对象指向分配的内存空间

    如果不使用volatile 这个步骤就会出现1-3-2的顺序,从而导致其他线程获取到一个未初始化的对象.

volatile关键字可以确保变量的可见性和禁止指令重排。当一个变量被volatile修饰时,编译器和处理器会注意到这个变量是共享的,因此不会将该变量所在的代码块进行指令重排。这样就可以避免由于指令重排导致的线程安全问题。

4:内部类

public class Singleton {
    private Singleton() {}
    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }
    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

5:枚举

public enum Singleton {
    INSTANCE;
}

标签:Singleton,JAVA,private,class,instance,static,单例,设计模式,public
From: https://www.cnblogs.com/zhjing/p/17929296.html

相关文章

  • JAVA设计模式(三)-原型
    JAVA设计模式(三)-原型本篇文章主要讲下java创建型设计模式中的原型模式.何谓原型模式:简单来说就是将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例。使用原型模式,就可以简化实例化的过程,不必依赖于构造函数或者new关键字.由于java提供了clone方法......
  • JAVA设计模式(二)-简单工厂
    JAVA设计模式(二)-简单工厂本篇文章主要讲下java创建型设计模式中的简单工厂模式.简单工厂模式又叫静态工厂方法模式(StaticFactoryMethodPattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。1:定义接口publicinterfacePeople{v......
  • 无涯教程-Java9 - 私有接口方法
    在Java8之前,接口可以具有以下类型的变量/方法。Constantvariables(常量)Abstractmethods  (抽象方法)因此,无涯教程不能在接口中实现方法实现,或更确切地说,不能在Java8之前拥有默认实现。请参见示例。publicclassTester{publicstaticvoidmain(String[]args)......
  • 无涯教程-Java9 - Process API增强
    在Java9ProcessAPI中,负责控制和管理操作系统进程的API已得到很大改进。ProcessHandle类提供了检查进程活动性和销毁进程的方法。它具有onExit方法,CompletableFuture类可以在进程退出时异步执行操作。importjava.time.ZoneId;importjava.util.stream.Stream;importjava.......
  • openjdk源码-java是如何执行shell命令的
    一般我们在java中调用shell脚本的方式如下publicintexecuteLinuxCmd(Stringcmd){LOGGER.info("cmd:{}",cmd);Runtimerun=Runtime.getRuntime();try{Processprocess=run.exec(cmd);InputStreamin=proce......
  • Unity单例模式
    单例模式通常用于生成单一管理者,例如假设游戏只能有一个玩家,那么就可以将玩家的控制器作为一个单例存在使用。或者场景控制,也可以作为一个单例来使用。//BaseManager.csusingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassSingleto......
  • 排查java代码慢-arthas工具
    1.下载地址,arthas(gitee.io)2.下载的是一个zip包 3.上传到服务器任意位置,解压 4.查看java进程ps-ef|grep进程名称显示结果的进程号是:1098156.cd到arthas根目录,执行命令java-jararthas-boot.jar109815启动成功如下:注意:如果是用systemctl启动的,注意下......
  • 深入探讨Java反射:解析机制与应用场景
    当谈及Java编程语言的强大功能时,反射(Reflection)是一个不可忽视的特性。反射允许程序在运行时检查和操作其自身的结构,这为开发者提供了一种动态获取信息和执行操作的途径。在本篇博客中,我们将深入探讨Java反射的原理、用法以及一些实际场景中的应用。什么是反射?反射是Java的一种......
  • 无涯教程-Java9 - Collection工厂方法
    使用Java9,新的工厂方法被添加到List,Set和Map接口以创建不可变的实例。用于以较少的冗长和简洁的方式创建集合。Collections旧方法importjava.util.ArrayList;importjava.util.Collections;importjava.util.HashMap;importjava.util.HashSet;importjava.util.List;im......
  • Java JDBC 详解、使用、连接池
    JDBC介绍Java数据库连接,JDBC(JavaDatabaseConnectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。简单说,jdbc是Java语言为了屏蔽具体的具体的数据库操作的细节不同提供的一个框架。在关系型数据库的处......