首页 > 编程语言 >Java实现单例模式

Java实现单例模式

时间:2023-12-27 10:23:10浏览次数:40  
标签:Singleton Java System 模式 instance static private 单例 out

饿汉式
静态常量饿汉式的优点是:在类装载的时候就完成实例化,没有达到Lazy Loading的效果,并且避免了线程同步问题。

它的缺点是:如果从始至终从未使用过这个实例,则会造成内存的浪费。


public class adaDemo3 {

    public static void main(String[] args) {
        Singleton instance = Singleton.getInstance();
        Singleton instance1 = Singleton.getInstance();
        System.out.println(instance1==instance);
        System.out.println(instance1.hashCode());
        System.out.println(instance.hashCode());
    }
}

class Singleton{

    private final static Singleton instance = new Singleton();

    private Singleton (){}

    public static Singleton getInstance(){
        return instance;
    }
}

懒汉式(双重检查)
效率可以,线程安全,推荐使用。

class Singleton{

    private static Singleton instance;

    private Singleton (){}

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

懒汉式(静态内部类)
利用JVM加载类时是线程安全的机制,推荐使用。

class Singleton{

    private Singleton (){}

    private static class InternalClass{
        private static final Singleton instance = new Singleton();
    }

    public static Singleton getInstance(){
        return InternalClass.instance;
    }
}

枚举类

public class adaDemo3 {

    public static void main(String[] args) {

        Singleton instance = Singleton.INSTANCE;
        Singleton instance1 = Singleton.INSTANCE;
        System.out.println(instance1==instance);
        System.out.println(instance1.hashCode());
        System.out.println(instance.hashCode());
        instance.test();
    }
}

enum Singleton{

    INSTANCE;

    void test(){
        System.out.println("test");
    }
}

标签:Singleton,Java,System,模式,instance,static,private,单例,out
From: https://www.cnblogs.com/yan061/p/17929941.html

相关文章

  • flutter常用的设计模式
    单例模式(SingletonPattern):确保一个类只有一个实例,并提供一个全局访问点。工厂模式(FactoryPattern):定义一个创建对象的接口,但让子类决定具体实例化哪个类;常用于创建组件、复杂对象等场景。抽象工厂模式(AbstractFactoryPattern):提供一个创建一系列相关或相互依赖对象的接口,而......
  • java中属性和变量的区别与final和抽象类
    属性和变量的区别变量必须要有初始值;属性可以没有初始值;变量的范围只在当前大括号内有效;属性是对象在哪里使用就在哪里有效;属性的作用范围要比变量的大一些属性和变量publicclassstudy01{ publicstaticvoidmain(String[]args){ //这是一个变量Stringnam......
  • 无涯教程-Java9 - @Deprecated增强
    @Deprecated注释是在Java5版本中引入的。用@Deprecated注释的程序元素表示,由于以下任何原因,不建议使用它-其用法可能会导致错误。它在将来的版本中可能不被兼容。它在将来的版本中可能会被删除。一个更好,更高效的替代方法取代了它。每当使用不推荐使用的元素时,编译器都会......
  • java 8 的新特性(三)
    java8新的日期时间APIJava8引入了一个新的日期时间API,也称为java.timeAPI,以替代旧的java.util.Date和java.util.Calendar类。这个新API提供了更清晰、更强大和更易于使用的日期和时间功能。Java8的日期时间API包括以下部分:日期和时间类型:包括LocalDate(日期),LocalTime(时间),LocalDa......
  • java异常处理
    异常:指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止。注意:在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象。Java处理异常的方式是中断处理异常机制其实是帮助我们找到程序中的问题,异常的根类是java.lang.......
  • 创建一个双模式跨运行时的 JavaScript 包
    本文将指导你发布双模式、跨运行时的JavaScript包。了解如何创建与ESM和CommonJS以及Node.js、Deno和浏览器等不同运行时兼容的库。随着JavaScript开发的不断发展,人们越来越需要能在多种环境中运行的强大依赖包。在本文中,我们将探讨如何发布跨运行时、双模式的JavaScr......
  • Java第十八课_线程和网络
    1.线程线程的休眠publicstaticvoidmain(String[]args){//线程的休眠//第一种方式(不推荐):try{Thread.sleep(3000);//毫秒}catch(InterruptedExceptione){e.printStackTrace();}......
  • 无涯教程-Java9 - Stream API增强
    Java9改进的StreamAPI添加了一些便利的方法,使流处理更容易,并使用收集器编写复杂的查询。Java9为Stream新增了几个方法:dropWhile、takeWhile、ofNullable,为iterate方法新增了一个重载方法。takeWhile语法defaultStream<T>takeWhile(Predicate<?superT>predic......
  • Java 日期转换运算工具类
    ​  参考文档:Java日期转换运算工具类-CJavaPy1、Date常用方法java.util.Date 是Java中表示日期和时间的一个基础类。但随着时间的推移,许多其方法被标记为过时,并被推荐在Java8引入的 java.time 包中的新类替代。但是,Date仍然在很多旧的代码库中广泛使用,并在与某......
  • stream的优化:java封装的拆箱与装箱的弊端
    authors.stream().map(author->author.getAge).map(age->age+10)//Stream<Integer>.filter(age>18)//Stream<Integer>.foreach(System.out::println);上述是一个简单的stream流的使用,当我们拆开第二个map,或者filter的时候会发现,传入和传出的参数都是Intege......