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

Java实现多种单例模式

时间:2023-09-04 23:01:38浏览次数:34  
标签:Java 模式 static 单例 Singleton2 Singleton3 new Singleton1 public


package com.java3y.austin.test.Mode;

import java.util.HashSet;
import java.util.concurrent.atomic.AtomicBoolean;

// 饿汉式单例
class Singleton1 {
    private Singleton1() {
    }

    private static final Singleton1 singleton1 = new Singleton1();

    public static Singleton1 getSingleton() {
        return singleton1;
    }

    public static void test() {
        Singleton1 singleton11 = Singleton1.getSingleton();
        AtomicBoolean isSingleton = new AtomicBoolean(true);
        System.out.println("==========Singleton1==============");
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                Singleton1 singleton12 = Singleton1.getSingleton();
                if (singleton11 != singleton12 && !singleton11.equals(singleton12)) {
                    isSingleton.set(false);
                }
            }).start();
        }
        System.out.println(isSingleton.get() == true ? "Singleton" : "No Singleton");
    }
}

// DCL,双重检测机制
class Singleton2 {
    private Singleton2() {
    }

    // 防止指令重排序,创建对象不是原子性的
    private static volatile Singleton2 singleton2 = null;

    public static Singleton2 getSingleton2() {
        if (singleton2 == null) {    // 避免多次获取锁
            synchronized (Singleton2.class) {
                if (singleton2 == null) {
                    singleton2 = new Singleton2();
                }
            }
        }
        return singleton2;
    }

    public void test() {
        HashSet<Singleton2> hashSet = new HashSet<>(100);
        System.out.println("==========Singleton2==============");
        for (int i = 0; i < 1000; i++) {
            new Thread(() -> {
                Singleton2 singleton12 = Singleton2.getSingleton2();
                hashSet.add(singleton12);
            }).start();
        }
        System.out.println(hashSet.size());

    }

}

/**
 * 静态内部类实现单例模式
 * 静态内部类只有在被调用时才会加载,且只加载一次, 实现懒加载效果和线程安全
 * 类加载器在加载类时会使用一种叫做"类加载锁"的机制,保证在同一时间只有一个线程能够加载该类
 */
class Singleton3 {

    private Singleton3() {
    }

    private static class SingletonInner {
        private static final Singleton3 singleton = new Singleton3();
    }

    public static Singleton3 getInstance3() {
        return SingletonInner.singleton;
    }

    public static void test() {
        Singleton3 singleton11 = Singleton3.getInstance3();
        AtomicBoolean isSingleton = new AtomicBoolean(true);
        System.out.println("==========Singleton3==============");
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                Singleton3 singleton12 = Singleton3.getInstance3();
                if (singleton11 != singleton12 && !singleton11.equals(singleton12)) {
                    isSingleton.set(false);
                }
            }).start();
        }
        System.out.println(isSingleton.get() == true ? "Singleton" : "No Singleton");
    }

}

public class SingletonTest {

    public static void main(String[] args) {
        // 写的test方法无法验证是否单例
    }

}

标签:Java,模式,static,单例,Singleton2,Singleton3,new,Singleton1,public
From: https://www.cnblogs.com/jishaling/p/17678341.html

相关文章

  • 单例设计模式
    单例设计模式基本介绍类的单例设计模式,就是采取一定的方式保证在整个的软件系统中,对某个类只能有一个对象实例存在,且类提供一个静态方法,用以获取该对象。例如Hibernate的SessionFactory,它是sql会话工厂,这个对象一定是很重的(创建需要加载很多资源和时间),一般情况下,只需要一个Se......
  • 如何在Java中连接MySQL数据库并实现增删改查操作
    要在Java中连接MySQL数据库并实现增删改查操作,你需要遵循以下步骤:导入所需的Java库:你需要导入Java中与MySQL连接和操作相关的库。常用的库包括JDBC(JavaDatabaseConnectivity)和MySQL驱动程序。importjava.sql.*;建立数据库连接:使用JDBC连接MySQL数据库,你需要提供数据库的URL、用......
  • SpringBoot项目报java.lang.IllegalStateException: Cannot load configuration class
    报错摘要:java.lang.IllegalStateException:Cannotloadconfigurationclass:com.imooc.demo.DemoApplication,Causedby:java.lang.ExceptionInInitializerError:null,Causedby:org.springframework.cglib.core.CodeGenerationException:java.lang.reflect.I......
  • JavaWeb项目3.0之后创建web项目
    在上一篇文章中我们看到创建web项目的过程,但是在web3.0之后有了注解的加入,可以更简单的创建Web项目。选择自己创建的maven项目,填写项目名称。 在项目中添加web模块 添加对应的打包形式 配置tomcat 添加对应模块  最为重要的我们不需要web.xml的繁琐......
  • 动手实践-AT模式的读写隔离问题
         ......
  • 动手实践-AT模式原理
       ......
  • java基础-数组-day06
    1.引入数组录入10个学生的成绩求和求平均importjava.util.Scanner;publicclassTestArray01{publicstaticvoidmain(String[]args){ Scannersc=newScanner(System.in); intsum=0; for(inti=1;i<=10;i++){ System.out.println("请输入第"+i+"......
  • Java开学测试
    二、系统背景:某机械有限公司为了公司进一步的发展,需要实现企业数字化管理,新引进一套企业信息管理系统(ERP),由于该产品缺乏入库功能,特委托石家庄铁道大学信息科学与技术学院前进22软件有限公司开发仓库管理功能。二、 数据结构要求:(5分)1、定义WarehouseInformation类,其中包括九个......
  • 无涯教程-JavaScript - DMAX函数
    描述DMAX函数返回列表或数据库中符合您指定条件的列中的最大数字。语法DMAX(database,field,criteria)争论Argument描述Required/Optionaldatabase组成列表或数据库的单元格范围。数据库是相关数据的列表,其中相关信息的行是记录,数据的列是字段。列表的第一行包......
  • 动手实践-XA模式代码
             ......