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 多线程,单例模式类(创建对象)最优写法的更多相关文章
- Java多线程——ThreadLocal类的原理和使用
Java多线程——ThreadLocal类的原理和使用 摘要:本文主要学习了ThreadLocal类的原理和使用. 概述 是什么 ThreadLocal可以用来维护一个变量,提供了一个ThreadLo ...
- Java多线程——ThreadLocal类
一.概述 ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量).也许把它命名 ...
- java多线程系类:JUC线程池:04之线程池原理(三)(转)
转载请注明出处:http://www.cnblogs.com/skywang12345/p/3509960.html 本章介绍线程池的生命周期.在"Java多线程系列--"基础篇& ...
- java多线程系类:JUC线程池:02之线程池原理(一)
在上一章"Java多线程系列--"JUC线程池"01之 线程池架构"中,我们了解了线程池的架构.线程池的实现类是ThreadPoolExecutor类.本章,我 ...
- java多线程系类:JUC线程池:01之线程池架构
概要 前面分别介绍了"Java多线程基础"."JUC原子类"和"JUC锁".本章介绍JUC的最后一部分的内容--线程池.内容包括:线程池架构 ...
- java多线程系类:JUC锁:01之框架
本章,我们介绍锁的架构:后面的章节将会对它们逐个进行分析介绍.目录如下:01. Java多线程系列--"JUC锁"01之 框架02. Java多线程系列--"JUC锁&q ...
- java多线程系类:基础篇:01基本概念:
这个系类的内容全部来源于http://www.cnblogs.com/skywang12345/p/3479024.html.特别在此声明!!! 本来想直接看那位作家的博客的,但还是复制过来. 多线程 ...
- 探Java多线程Thread类和Runnable接口之间的联系
首先复习一下Java多线程实现机制,Java实现多线程方法有如下这么几种: 1.继承了(extends)Thread类 2.实现了(implements)Runnable接口 也就是说 有如下两种情 ...
- Java多线程工具类之循环栅栏计数器
Java多线程下循环计数器 本文主要内容:CyclicBarrier(下文中凯哥就用cycBar来代替)定义介绍:举例说明:代码演示:从源码来看原理及总结:CyclicBarrier与CountDow ...
- Java多线程Thread类了解和使用
创建线程的两种方式 extends Thread 类 public class WelComeApp { public static void main(String[] args) { Welcom ...
随机推荐
- DirectX12 3D 游戏开发与实战第七章内容(上)
利用Direct3D绘制几何体(续) 学习目标 学会一种无须每帧都要刷新命令队列的渲染流程,以此来优化性能 了解另外两种根签名参数类型:根常量和根描述符 探索如何在程序中生成和绘制常见的几何体:如栅格 ...
- git冲突
常规操作: # quan @ quandeMacBook-Pro in ~/Desktop/10-01/app_addressing----quan on git:1.0.1.Release o [1 ...
- 完全用Deepin Linux娱乐、工作、学习(1)
截至今天我已经用全Deepin Desktop Linux环境娱乐.工作.学习了100多天.当你看到这个桌面的时候,会不会觉得它是MacOS?错了,它是Deepin Desktop Linux,而且它 ...
- 使用C语言来扩展PHP,写PHP扩展dll
转自http://www.cnblogs.com/myths/archive/2011/11/28/2266593.html 以前写过一次PHP扩展DLL,那个是利用调用系统的COM口实现的扩展,与P ...
- opencv学习(三)——绘图功能
绘图功能 我们将学习以下函数:cv.line(),cv.circle(),cv.rectangle(),cv.ellipse(),cv.putText()等. 在这些功能中,有一些相同的参数: img ...
- python-3.x- 序列操作
1. list操作 A.添加元素 1 list = ["C++","C", "Java", "Python"] 2 &q ...
- 日常Java 2021/9/21
将Java数组中的元素前后反转.题目要求:已知一个数组arr = {11,12,13,14,15}用程序实现把该数组中的元素值交换,交换后的数组arr = { 15,14,13,12,11},并输出交 ...
- A Child's History of England.49
But he was shipwrecked in the Adriatic Sea, and was fain [happy, willing] to pass through Germany, u ...
- day14搭建博客系统项目
day14搭建博客系统项目 1.下载代码包 [root@web02 opt]# git clone https://gitee.com/lylinux/DjangoBlog.git 2.使用pid安装 ...
- Scala(三)【函数式编程】
目录 一.方法和函数 1.方法 1)基本语法 2)简化原则 3)方法参数 2.函数 3.方法和函数的区别 二.高阶函数 三.匿名函数 四.柯里化 五.闭包 一.方法和函数 1.方法 1)基本语法 de ...