java 3种单例模式

1.饿汉式

 1 package singleInstance;
 2 /**饿汉式,类加载时候创建实例,浪费资源,线程是安全的*/
 3 public class SingleDome01 {
 4     //私有构造方法,防止直接new对象
 5     private SingleDome01() {
 6     }
 7     //类加载的时候,创建对象
 8     private static SingleDome01 instance = new SingleDome01();
 9     //提供getter,方便外界访问私有对象
10     public static SingleDome01 getInstance() {
11         return instance;
12     }
13 }

2.懒汉式

 1 package singleInstance;
 2 /**懒汉式,被调用时候才会实例化,节约资源,高并发线程时不安全*/
 3 public class SingleDome02 {
 4     //私有构造方法,防止直接new对象
 5     private SingleDome02(){
 6     }
 7     private static SingleDome02 instance;
 8     //提供getter,以便外界调用私有对象,返回SingleDome02对象
 9     public static SingleDome02 getInstance() {
10         if(instance==null){
11             instance = new SingleDome02();
12         }
13         return instance;
14     }
15 }

 3.饿汉式与懒汉式改良

 1 package singleInstance;
 2 /**采用内部类实例化对象,在调用时候才会加载,节约资源,还能保证线程是安全的*/
 3 public class SingleDome03 {
 4     //私有构造方法,防止直接new对象
 5     private SingleDome03() {
 6     }
 7     //静态内部类只有在调用时候才会加载
 8     private static class InnerSingleDome03{
 9         private static SingleDome03 instance = new SingleDome03();
10     }
11     public static SingleDome03 getInstance(){
12         return InnerSingleDome03.instance;
13     }
14 }

 4.登记式

 1 package singleInstance;
 2 
 3 import java.util.HashMap;
 4 import java.util.Map;
 5 
 6 /**采用spring的用法,利用反射创建对象,讲实例注册到map里面,下次用的时候直接取*/
 7 public class SingleDome04 {
 8     //私有构造方法,防止外部直接new对象
 9     private SingleDome04() {
10     }
11     private static Map<String,SingleDome04> map = new HashMap<String,SingleDome04>();
12     //静态代码块,类加载时候实例化对象和map,并将对象放入map里
13     static{
14         SingleDome04 instance = new SingleDome04();
15         map.put(instance.getClass().getName(), instance);
16     }
17     public static SingleDome04 getInstance(String name){
18         if(name==null){
19             name="singleInstance.SingleDome04";
20         }
21         if(!map.containsKey(name)){
22             try {
23                 map.put(name, (SingleDome04)Class.forName(name).newInstance());
24             } catch (InstantiationException e) {
25                 e.printStackTrace();
26             } catch (IllegalAccessException e) {
27                 e.printStackTrace();
28             } catch (ClassNotFoundException e) {
29                 e.printStackTrace();
30             }
31         }
32         return map.get(name);
33     }
34 }

最后测试代码:

 1 package singleInstance;
 2 
 3 public class TestSingle {
 4     public static void main(String[] args) {
 5         SingleDome01 s1 = SingleDome01.getInstance();
 6         SingleDome01 s2 = SingleDome01.getInstance();
 7         if(s1==s2){
 8             System.out.println("s1=s2");
 9         }else{
10             System.out.println("s1!=s2");
11         }
12         SingleDome02 s3 = SingleDome02.getInstance();
13         SingleDome02 s4 = SingleDome02.getInstance();
14         if(s3==s4){
15             System.out.println("s3=s4");
16         }else{
17             System.out.println("s3!=s4");
18         }
19         SingleDome03 s5 = SingleDome03.getInstance();
20         SingleDome03 s6 = SingleDome03.getInstance();
21         if(s5==s6){
22             System.out.println("s5=s6");
23         }else{
24             System.out.println("s5!=s6");
25         }
26         SingleDome04 s7 = SingleDome04.getInstance("singleInstance.SingleDome04");
27         SingleDome04 s8 = SingleDome04.getInstance("singleInstance.SingleDome04");
28         if(s7==s8){
29             System.out.println("s7=s8");
30         }else{
31             System.out.println("s7!=s8");
32         }
33     }
34 }

 

转载于:https://www.cnblogs.com/miyin/p/3963316.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473052.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在c#中用mutex类实现线程的互斥_面试官经常问的synchronized实现原理和锁升级过程,你真的了解吗...

本篇文章主要从字节码和JVM底层来分析synchronized实现原理和锁升级过程&#xff0c;其中涉及到了简单认识字节码、对象内部结构以及ObjectMonitor等知识点。阅读本文之前&#xff0c;如果大家对synchronized关键字的基本使用还不是很了解的话&#xff0c;推荐阅读笔者之前的一…

TensorFlow 2.x GPU版在conda虚拟环境下安装步骤

先下载安装驱动&#xff1a;https://www.nvidia.cn/Download/index.aspx?langcn&#xff0c;版本要求 WSL cuda 驱动 https://developer.nvidia.com/cuda/wsl 下载安装 anaconda&#xff0c;管理虚拟环境&#xff1a;https://www.anaconda.com/products/individual&#xff0…

如何通过网络将文件传输到嵌入式设备_嵌入式系统 Boot Loader技术内幕,带你完全了解Boot Loader...

一个嵌入式 Linux 系统从软件的角度看通常可以分为四个层次&#xff1a;1. 引导加载程序。包括固化在固件(firmware)中的 boot 代码(可选)&#xff0c;和 Boot Loader 两大部分。2. Linux 内核。特定于嵌入式板子的定制内核以及内核的启动参数。3. 文件系统。包括根文件系统和建…

TensorFlow 2.0 - CNN / 预训练 / RNN

文章目录1. CNN 卷积神经网络2. 预训练模型3. RNN 循环神经网络学习于&#xff1a;简单粗暴 TensorFlow 2 1. CNN 卷积神经网络 卷积神经网络&#xff0c;卷积后尺寸计算 tf.keras.layers.Conv2D&#xff0c; tf.keras.layers.MaxPool2D # CNN 模型 class myCNN(tf.keras.M…

openwrt mt7620 内存大小检测

单独编译内核: make Vs target/linux/install 相调函数调用流程&#xff1a; init/main.c : start_kernel() -> setup_arch(&command_line) arch/mips/kernel/setup.c: setup_arch()-> cpu_probe()-> prom_init()-> arch_mem_init() -> plat_mem_setup() -&…

python获取当前路径的方法_Python获取脚本所在目录的正确方法【转】

原博文 2015-09-24 10:21 − 1.以前的方法如果是要获得程序运行的当前目录所在位置&#xff0c;那么可以使用os模块的os.getcwd()函数。如果是要获得当前执行的脚本的所在目录位置&#xff0c;那么需要使用sys模块的sys.path[0]变量或者sys.argv[0]来获得。实际上sys.path是Pyt…

JAVA NIO 简介(转)

1. 基本 概念IO 是主存和外部设备 ( 硬盘、终端和网络等 ) 拷贝数据的过程。 IO 是操作系统的底层功能实现&#xff0c;底层通过 I/O 指令进行完成。 所有语言运行时系统提供执行 I/O 较高级别的工具。 (c 的 printf scanf,java 的面向对象封装 ) 2. Java 标准 io 回顾Jav…

TensorFlow 2.0 - Keras Pipeline、自定义Layer、Loss、Metric

文章目录1. Keras Sequential / Functional API2. 自定义 layer3. 自定义 loss4. 自定义 评估方法学习于&#xff1a;简单粗暴 TensorFlow 2 1. Keras Sequential / Functional API tf.keras.models.Sequential([layers...])&#xff0c;但是它不能表示更复杂的模型 mymodel…

python去重复元素_Python实现去除列表中重复元素的方法总结【7种方法】

这里首先给出来我很早之前写的一篇博客&#xff0c;Python实现去除列表中重复元素的方法小结【4种方法】&#xff0c;感兴趣的话可以去看看&#xff0c;今天是在实践过程中又积累了一些方法&#xff0c;这里一并总结放在这里。 由于内容很简单&#xff0c;就不再过多说明了&…

oracle取差值集合

Oracle Minus关键字 SQL中的MINUS关键字 SQL中有一个MINUS关键字&#xff0c;它运用在两个SQL语句上&#xff0c;它先找出第一条SQL语句所产生的结果&#xff0c;然后看这些结果有没有在第二个SQL语句的结果中。如果有的话&#xff0c;那这一笔记录就被去除&#xff0c;而不会…

TensorFlow 2.0 - Checkpoint 保存变量、TensorBoard 训练可视化

文章目录1. Checkpoint 保存变量2. TensorBoard 训练过程可视化学习于&#xff1a;简单粗暴 TensorFlow 2 1. Checkpoint 保存变量 tf.train.Checkpoint 可以保存 tf.keras.optimizer 、 tf.Variable 、 tf.keras.Layer 、 tf.keras.Model path "./checkp.ckpt" …

coturn的负载均衡特性_高性能负载均衡

单服务器无论如何优化&#xff0c;无论采用多好的硬件&#xff0c;总会有一个性能天花板&#xff0c;当单服务器的性能无法满足业务需求时&#xff0c;就需要设计高性能集群来提升系统整体的处理性能。高性能集群的本质很简单&#xff0c;通过增加更多的服务器来提升系统整体的…

LintCode MySQL 1928. 网课上课情况分析 I

文章目录1. 题目2. 解题1. 题目 online_class_situation 表展示了一些同学上网课的行为活动。 每行数据记录了一名同学在退出网课之前&#xff0c;当天使用同一台设备登录课程后听过的课程数目&#xff08;可能是0个&#xff09;。 写一条 SQL 语句&#xff0c;查询每位同学第…

poj1284:欧拉函数+原根

何为原根&#xff1f;由费马小定理可知 如果a于p互质 则有a^(p-1)≡1(mod p)对于任意的a是不是一定要到p-1次幂才会出现上述情况呢&#xff1f;显然不是&#xff0c;当第一次出现a^k≡1(mod p)时&#xff0c; 记为ep&#xff08;a&#xff09;k 当k(p-1)时&#xff0c;称a是p的…

python输入十个数输出最大值_python输入十个数如何输出最大值

python输入十个数输出最大值的方法&#xff1a;1、如果是整数的话&#xff0c;使用函数【a, b, c map(int, input().split())】&#xff1b;2、使用函数【Xinput().split()】。 相关免费学习推荐&#xff1a;python视频教程 python输入十个数输出最大值的方法&#xff1a; 第一…

SQL Server 2005远程连接连不上的解决办法收藏 Microsoft给的方法

SQL Server 2005远程连接连不上的解决办法收藏 Microsoft给的方法http://support.microsoft.com/kb/914277 是可以的,但我怕以后还会遇到这问题,干脆我也写到blog中来. 我的情况是别人怎么连也连不上我本地的DB,我装了2005的sp2也不行,后来发现关了防火墙就可以了,但我总不能什…

LintCode MySQL 1921. 从不充值的玩家(where not in)

文章目录1. 题目2. 解题1. 题目 描述 A game database contains two tables, player table and recharge table. Write a SQL query to find all players who never recharge. 样例 https://www.lintcode.com/problem/players-who-never-recharge/description 2. 解题 -- …

古风一棵桃花树简笔画_广东有个现实版的“桃花源”,藏于秘境之中,最适合情侣来度假!...

上学时&#xff0c;初闻“芳草鲜美&#xff0c;落英缤纷”&#xff0c;并没有多大感触。直到后来长大离家&#xff0c;每每为生活奔波劳累时&#xff0c;为工作琐碎忧心费神时&#xff0c;才骤然明了当年五柳先生所描绘的“桃花源”该是多少人的脑中所想、心中所向……原以为这…

关于NIOS ii烧写的几种方式(转)

源&#xff1a;http://www.cnblogs.com/bingoo/p/3450850.html 1. 方法一&#xff1a;.sof和.elf全部保存在FPGA内&#xff0c;程序加载和运行也是在FPGA内部。 把FPGA的配置文件.sof通过JTAG方式下载(其实是在线运行)进入FPGA本身&#xff0c;此时在NIOS II的界面中&#xff…

clob和blob是不是可以进行模糊查询_你知道什么是 MySQL 的模糊查询?

作者 | luanhz责编 | 郭芮本文对MySQL中几种常用的模糊搜索方式进行了介绍&#xff0c;包括LIKE通配符、RegExp正则匹配、内置字符串函数以及全文索引&#xff0c;最后给出了性能对比。引言MySQL根据不同的应用场景&#xff0c;支持的模糊搜索方式有多种&#xff0c;例如应用最…