首页 > 编程语言 >Java中DCL单例模式设计

Java中DCL单例模式设计

时间:2022-11-14 00:12:10浏览次数:38  
标签:DCL Java Thread 对象 ---- instance Del 单例 new

概述

单例:某个类,对外永远只有一个对象。

实现

步骤:

/**
 * 单例模式:懒汉式套路基础上加入并发控制(synchronized、volatile),保证多线程环境下,对外始终只有一个对象。
 * 1、构造器私有化---->避免外部  new  构造器
 * 2、提供私有的静态属性---->储存对象地址
 * 3、提供公共的静态方法---->获取属性
 */

示例代码:

class Del{
    /**
     * 2、提供私有的静态属性---->储存对象地址
     * 在调用方法的时候才创建对象:懒汉式
     * 加入volatile保证创建对象不出错,不会被某个对象拿到空对象。
     */
    private static volatile Del instance;

    //1、构造器私有化---->避免外部  new  构造器
    private  Del(){ }
    //3、提供公共的静态方法---->获取属性(唯一对象)
    public static Del getInstance(){
        //双重检测,提供性能。
        if(null!=instance){
            return instance;
        }
        synchronized (Del.class) {
            if (instance == null) {
                //存在指令重排的可能:创建一个对象:1、开辟空间。2、初始化对象信息。3、返回对象地址给引用。
                instance = new Del();
            }
            return instance;
        }
    }
}

测试程序:

public class LeaningThread {
    public static void main(String[] args) throws InterruptedException {
        new Thread(()->{
            System.out.println(Thread.currentThread().getName()+":"+Del.getInstance());
        },"线程一").start();

        new Thread(()->{
            System.out.println(Thread.currentThread().getName()+":"+Del.getInstance());
        },"线程二").start();

        new Thread(()->{
            System.out.println(Thread.currentThread().getName()+":"+Del.getInstance());
        },"线程三").start();

        System.out.println(Thread.currentThread().getName()+":"+Del.getInstance());
    }
}

运行结果:

 

总结

实现单例模式的方法有很多。

步骤通常是:

* 1、构造器私有化---->避免外部  new  构造器 
* 2、提供私有的静态属性---->储存对象地址
* 3、提供公共的静态方法---->获取属性(对象)

标签:DCL,Java,Thread,对象,----,instance,Del,单例,new
From: https://www.cnblogs.com/lurenjia-bky/p/16887775.html

相关文章

  • JavaWeb笔记(4)
    1.get请求请求方式  get请求的资源路径[+?+请求参数]请求协议版本号  THPP/1.12.请求头key:value组成  不同的键值,表示不同的涵义GET请求的HTTP协议内......
  • Java语法概述
    1.JDK,JRE,JVM三者之间的关系,以及JDK、JRE包含的主要结构有哪些JDK=JRE+Java的开发工具(javac.exe、java.exe、javadoc.exe)JRE=JVM+Java核心类库2.为什么要配......
  • Java中指令重排在多线程中出现数据错误的例子
    概述听说当两条指令互相不依赖的时候,在cpu或者jvm那儿可能会为了提高性能而进行指令重排。数据依赖比如下面两条代码就没有数据依赖:int a=5;int b=2;这两条指......
  • java时间工具类
    packagecom.example.httpdemo2.utils;importjava.text.DateFormat;importjava.text.ParseException;importjava.text.SimpleDateFormat;importjava.util.ArrayLi......
  • java——继承与多态——final关键字001
    final关键字概念与四种用法:          final关键字用于修饰类:             final关键字用于修饰成员方法:   ......
  • Java 序列化与反序列化
    (目录)一、说明序列化与反序列化是什么序列化:将Java对象表示为一个字节序列,存储对象数据到文件中,可用于网络传输反序列化:从文件中读取序列化对象,对它进行反序列化,恢......
  • Javascript的预解析
    浏览器不是直接运行JS的,是调用js引擎运行js.js引擎运行js分为两个步骤:1.预解析:js引擎会把js里面所有的var,以及所有的function提升到当前作用域的最前面2.代码执行......
  • Head First Java 读书笔记 15章
    第15章:网络与线程(网络联机)在Java中,所有网络运作的低层细节都已经由java.net函数库处理。Java中,传送和接收网络上的数据,是在链接上使用不同链接串流的输入和输出。什么......
  • Java开发学习(四十一)----MyBatisPlus标准数据层(增删查改分页)开发
    一、标准CRUD使用对于标准的CRUD功能都有哪些以及MyBatisPlus都提供了哪些方法可以使用呢?我们先来看张图:1.1环境准备这里用的环境就是Java开发学习(四十)----MyBat......
  • java
    可变参数在方法声明中,在指定参数类型后加一个省略号(...)一个方法中只能指定一个可变参数,它必须是方法的最后一个参数,任何普通的参数必须唉它之前声明    ......