单例模式

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
注意:
  • 1、单例类只能有一个实例。
  • 2、单例类必须自己创建自己的唯一实例。
  • 3、单例类必须给所有其他对象提供这一实例。
import java.util.HashSet;
import java.util.Set; /**
* @ClassName SingleInstance
* @projectName: object1
* @author: Zhangmingda
* @description: 单例模式,多个线程创建这个类的实例,实际只返回同一个对象
* date: 2021/4/26.
*/
public class SingleInstance {
/**
* 用一个私有变量存放自己这个类的对象
*/
private static SingleInstance singleInstance = null; /**
* 将构造方法私有化,避免被外面的类new出来
*/
private SingleInstance() {
}
/**
* 提供获取实例的方法
*/
public static SingleInstance instance(){
String tName = Thread.currentThread().getName();
// System.out.println(tName + "获取/创建实例");
/**
* 方式1:两层if判断,第一层判断不为null直接返回(快速),第二层加锁再判断一次,保证只有一个线程创建实例,其他线程二次判断不为null直接返回
*/
if (singleInstance == null){
/**
* 同步代码块避免多线程同时运行时,同时运行到此处并发都认为singleInstance == null,导致并发创建实例
*/
System.out.println( tName+ "判断当前实例为null");
synchronized (SingleInstance.class){
if (singleInstance == null){
System.out.println(tName + "创建实例");
singleInstance = new SingleInstance();
}
else {
System.out.println(tName + "创建实例前二次判断,发现已有实例");
}
}
}else {System.out.println(tName + "第一次判断,发现已有实例");} /**
* 方式二:所有创建对象的线程进来都串行判断,效率要比方式1低,因为明明有已存在实例,也得等别的线程释放锁才能返回实例
* 同步代码块避免多线程同时运行时,同时运行到此处并发都认为singleInstance == null,导致并发创建实例
*/
// synchronized (SingleInstance.class){
// if (singleInstance == null){
// System.out.println(tName + "创建实例");
// singleInstance = new SingleInstance();
// }else {
// System.out.println(tName + "获取到已存在实例");
// }
// }
return singleInstance;
} public static void main(String[] args) throws InterruptedException {
Runnable r = () -> {
SingleInstance.instance();
};
Set<Thread> singleInstances = new HashSet<>();
for (int i=0; i<10; i++) {
singleInstances.add(new Thread(r,"t"+i));
}
singleInstances.forEach(thread -> thread.start());
Thread.sleep(1000);
}
}

java 多线程,单例模式类(创建对象)最优写法的更多相关文章

  1. Java多线程——ThreadLocal类的原理和使用

    Java多线程——ThreadLocal类的原理和使用 摘要:本文主要学习了ThreadLocal类的原理和使用. 概述 是什么 ThreadLocal可以用来维护一个变量,提供了一个ThreadLo ...

  2. Java多线程——ThreadLocal类

    一.概述   ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量).也许把它命名 ...

  3. java多线程系类:JUC线程池:04之线程池原理(三)(转)

    转载请注明出处:http://www.cnblogs.com/skywang12345/p/3509960.html 本章介绍线程池的生命周期.在"Java多线程系列--"基础篇& ...

  4. java多线程系类:JUC线程池:02之线程池原理(一)

    在上一章"Java多线程系列--"JUC线程池"01之 线程池架构"中,我们了解了线程池的架构.线程池的实现类是ThreadPoolExecutor类.本章,我 ...

  5. java多线程系类:JUC线程池:01之线程池架构

    概要 前面分别介绍了"Java多线程基础"."JUC原子类"和"JUC锁".本章介绍JUC的最后一部分的内容--线程池.内容包括:线程池架构 ...

  6. java多线程系类:JUC锁:01之框架

    本章,我们介绍锁的架构:后面的章节将会对它们逐个进行分析介绍.目录如下:01. Java多线程系列--"JUC锁"01之 框架02. Java多线程系列--"JUC锁&q ...

  7. java多线程系类:基础篇:01基本概念:

    这个系类的内容全部来源于http://www.cnblogs.com/skywang12345/p/3479024.html.特别在此声明!!! 本来想直接看那位作家的博客的,但还是复制过来. 多线程 ...

  8. 探Java多线程Thread类和Runnable接口之间的联系

    首先复习一下Java多线程实现机制,Java实现多线程方法有如下这么几种: 1.继承了(extends)Thread类 2.实现了(implements)Runnable接口 也就是说  有如下两种情 ...

  9. Java多线程工具类之循环栅栏计数器

    Java多线程下循环计数器 本文主要内容:CyclicBarrier(下文中凯哥就用cycBar来代替)定义介绍:举例说明:代码演示:从源码来看原理及总结:CyclicBarrier与CountDow ...

  10. Java多线程Thread类了解和使用

    创建线程的两种方式 extends Thread 类 public class WelComeApp { public static void main(String[] args) { Welcom ...

随机推荐

  1. 解决fatal: unable to access '': Failed to connect to 127.0.0.1 port 1181: Connection refused的问题

    今天把项目提交的git远程的时候遇到一个问题 fatal: unable to access '': Failed to connect to 127.0.0.1 port 1181: Connect ...

  2. 洛谷 P5044 - [IOI2018] meetings 会议(笛卡尔树+DP+线段树)

    洛谷题面传送门 一道笛卡尔树的 hot tea. 首先我们考虑一个非常 naive 的区间 DP:\(dp_{l,r}\) 表示区间 \([l,r]\) 的答案,那么我们考虑求出 \([l,r]\) ...

  3. Latex 文档格式化

    title: "Latex 文档格式化" author: 李龙翔 date: "Nov 22, 2019" subject: "Markdown&qu ...

  4. [Ocean Modelling for Begineers] Ch5. 2D Shallow-Water Modelling

    本章利用二维浅水模型研究表面重力波的不同物理过程,如湖水中风驱动流体,正压不稳定机制(?the barotropic instability mechanism).本章将为读者介绍使用不同的对流格式模 ...

  5. 45-Letter Combinations of a Phone Number

    Letter Combinations of a Phone Number My Submissions QuestionEditorial Solution Total Accepted: 7855 ...

  6. Excel-统计各分数段人数 frequency()

    FREQUENCY函数 函数名称:FREQUENCY 主要功能:以一列垂直数组返回某个区域中数据的频率分布. 使用格式:FREQUENCY(data_array,bins_array) 参数说明:Da ...

  7. Tomcat类加载机制和JAVA类加载机制的比较

    图解Tomcat类加载机制    说到本篇的tomcat类加载机制,不得不说翻译学习tomcat的初衷.    之前实习的时候学习javaMelody的源码,但是它是一个Maven的项目,与我们自己的 ...

  8. day12 form组件

    day12 form组件 今日内容 form组件前戏 form组件基本定义 form组件数据校验功能 form组件渲染标签 form组件提示信息 数据校验进阶 form组件补充 form组件源码探索 ...

  9. Hadoop fs.copyToLocalFile错误

    fs.copyToLocalFile(new Path("/study1/1.txt"), new Path("C:/Users/Administrator/Deskto ...

  10. 商业爬虫学习笔记day5

    一. 发送post请求 import requests url = "" # 发送post请求 data = { } response = requests.post(url, d ...