Java手写单例之饿汉式、懒汉式、双重判定锁。_1、手写单例(懒汉、饿汉、双锁安全全部写一遍)-程序员宅基地

技术标签: Java手写单列  懒汉式  饿汉式  Java单列  双重判定锁  

Java手写单例之饿汉式、懒汉式、双重判定锁。

package org.fh.action;
/**
 * 饿汉式
 * @author Administrator
 *
 */
public class Singleton {
	/**
	 * 私有的   final 修饰的变量 不能被二次赋值
	 */
	private static final Singleton singleton = new Singleton();
	
	/**
	 * 默认的无参构造
	 */
	private Singleton(){
	}
	
	/**
	 * 公共的方法
	 */
	public static Singleton getInsta(){
		return singleton;
	}
	
}


package org.fh.action;
/**
 * 懒汉式 
 * @author Administrator
 */
public class Singleton2 {
	private static Singleton2 singleton2 = null;
	
	private Singleton2(){
	}
	
	//  加锁
	//  当第一个线程 执行完毕之后,第二个才能进去    弊端效率低
	//	双重判定锁
	public synchronized static Singleton2 getInstance(){
		// 多个线程同时创建 该对象  (线程不安全)
		if(singleton2 == null){
			singleton2 = new Singleton2();
		}
		return singleton2;
	}
}



package org.fh.action;
/**
 * 双重判定锁 (效率高,线程安全)
 * @author Administrator
 *
 */
public class Singleton3 {
	//禁止编译器重排序
	private volatile static Singleton3 singleton3 = null;
	
	private Singleton3(){
		
	}
	//
	public static Singleton3 getInstance(){
		// 执行效率高
		if(singleton3 == null){
			// 第一个线程执行完毕之后,第二个线程才能进去
			synchronized (Singleton3.class) {
				// 保证单例
				if(singleton3 == null){
					singleton3 = new Singleton3();
				}
			}
		}
		return singleton3;
	}
}



package org.fh.action;

import org.fh.model.Book;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {

	public static void main(String[] args) {
		//加载spring配置文件
		ClassPathXmlApplicationContext cl = new ClassPathXmlApplicationContext("applicationContext.xml");
		//取对象
		BookAction bookAction = (BookAction) cl.getBean("bookAction");
		
		BookAction bookAction2 = (BookAction) cl.getBean("bookAction");
		
		//对象的哈希吗值一致说明  同一个内存地址
		System.out.println(bookAction);
		
		System.out.println(bookAction2);
		//执行方法
				bookAction.queryBook();
		// true   同一个内存地址
		System.out.println(bookAction == bookAction2);
		
		System.out.println("======================================");
		Book book = new Book();
		Book book2 = new Book();
		
		System.out.println(book);
		System.out.println(book2);
		System.out.println(book == book2);
		
		System.out.println("======================================");
		
		//创建的该类的无参构造
		//Singleton singleton = new Singleton();
		
		Singleton insta = Singleton.getInsta();
		Singleton insta2 = Singleton.getInsta();
		System.out.println(insta);
		System.out.println(insta2);
		
		System.out.println(insta == insta2);
		System.out.println("======================================");
		
		Singleton2 instance = Singleton2.getInstance();
		Singleton2 instance2 = Singleton2.getInstance();
		System.out.println(instance);
		System.out.println(instance2);
		//equals  比较的是内容     ==  比较的是内存地址
		System.out.println(instance == instance2);
		
	}
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44781909/article/details/90401775

智能推荐

jQuery插件模块化(SeaJS)及其调用方式_jq $sea-程序员宅基地

文章浏览阅读1.3k次。jQuery插件本质上是将命名空间挂在全局的jQuery或jQuery.fn上而非使用define定义的模块。 JQuery的这种扩展机制同模块化要求模块的独立性,以及模块互相隔离有点冲突。 jQuery插件数目众多,我们不打算做大量的转换工作,为模块化而模块化,甚至改变插件的调用方式, 这样对开发带来的价值不大。只希望通过模块加载器实现自动的依赖管理,按需加载,并且使用方式自然。1.常见_jq $sea

我来学网络——IIS中出现"无效的应用程序池名称"-程序员宅基地

文章浏览阅读6.1k次,点赞8次,收藏4次。先查看IIS里的"应用程序池",是否至少有一个DefaultAppPool,如果没有自己创建一个; 再点击IIS里的"网站",点击最右边的"设置网站默认设置",在弹出的窗口里面查看"应用程序池"是否被选择,如果为空,就随便选择一个。..._无效的应用程序池名称

CSS transition的用法_css的transition用法-程序员宅基地

文章浏览阅读1.1k次。transition 过渡用法_css的transition用法

55jqGrid 分组 - 多分组所有级数求和(新)_jquery 多层分组统计-程序员宅基地

文章浏览阅读895次。分组可以在远程数据上实现。如果选项groupDataSorted被打开,那么sidx参数将被放到分组列名上。这样,服务器就知道通过第一个分组咧进行排序,并且对列进行排序。HTML代码举例<html> <head> <title>jqGrid 实例</title> </head> <body> ..._jquery 多层分组统计

Python 程序设计搞心态题目集锦(PTA平台)_搞人心态的代码-程序员宅基地

文章浏览阅读308次。浙大版《Python 程序设计》搞心态题目集锦(NO.1)(1).为了提倡居民节约用电,某省电力公司执行“阶梯电价”,安装一户一表的居民用户电价分为两个“阶梯”:月用电量50千瓦时(含50千瓦时)以内的,电价为0.53元/千瓦时;超过50千瓦时的,超出部分的用电量,电价上调0.05元/千瓦时。请编写程序计算电费。输入格式:输入在一行中给出某用户的月用电量(单位:千瓦时)。输出格式:在一行中输出该用户应支付的电费(元),结果保留两位小数,格式如:“cost = 应付电费值”;若用电量小于0,则输出"_搞人心态的代码

centos7搭建DNS服务完整版_centos7搭建dns解析服务器-程序员宅基地

文章浏览阅读4.3k次,点赞2次,收藏31次。第三步,进入vim /etc/named.rfc1912.zones配置文件,进行配置,pip.cc是我要设置的域名,而80.168.192是我设置的网段,其中file 名字,可根据你的需要起,并且要与/var/named/文件的配置文件一一对应。第四步,然后cd /var/named/目录下使用touch 创建两个文件要与上面的文件一一对应。dns服务:是域名解析服务,它的作用是将域名解析成IP地址,或者是将IP地址解析成域名。@dns.pip.cc. 是你的主机名加上域名(注意细节cc.的点点)_centos7搭建dns解析服务器

随便推点

RK3399—用户态操作EEPROM_rk3399 mac地址使用eeprom-程序员宅基地

文章浏览阅读1k次。  在此之前,在其他平台上应用i2c总线用户接口(ioctrl)进行访问EEPROM,具体可以参考“嵌入式Linux下 24系列EEPROM/FRAM驱动”文章。现将其移植到RK3399平台运行。编译系统:Ubuntu16.04ARM硬件:firefly RK3399ARM系统:firefly Ubuntu16.04(SDK)连接i2c:i2c4EEPROM:AT24C02电路原理图..._rk3399 mac地址使用eeprom

yolov5的工业化部署_yolov5如何部署到工控机上-程序员宅基地

文章浏览阅读1.6k次,点赞2次,收藏14次。背景老规矩首先背景介绍一下,目的就是为了把pytorch的模型部署在ros上,而ros主要使用的C++,所以我本次的目的就是使用C++调用模型。为什么使用C++呢?当然是因为c++的性能更高了。我的电脑配置:I5处理器英伟达的1050ti显卡,4g显存运行内存8Gcuda10.2,cudnn7.6.5pytorch模型将 PyTorch 模型转换为 Torch Script对于这步,ptorch的官网提供了两种方法,利用Tracing将模型转换为Torch Script通过Ann_yolov5如何部署到工控机上

Office安装找不到Office.zh-cn\***文件以及安装后无法正常显示图标_2016安装程序找不到proofing.zh-cn\proofing.xml-程序员宅基地

文章浏览阅读1w次。问题1:Office安装报错错误详情:找不到Office.zh-cn\***.xml、.dll等文件解决方法:把Project 2013安装包(电脑安装过的微软办公产品)中的”office.zh-cn、office32.zh-cn、proofing.zh-cn、osm.zh-cn"这四个文件夹全部用office 2013安装包中,替换Office 2013安装包钟原始文件,即可成功安装。(重..._2016安装程序找不到proofing.zh-cn\proofing.xml

k8s节点出现内存溢出导致监控告警(解答版)_监控message out of memory 日志 告警-程序员宅基地

文章浏览阅读3.3k次,点赞2次,收藏3次。疑问:背景是有台物理机因为内存溢出 然后告警了 告警规则是 检测 message中out of memroy 字段,而且物理机是k8s的节点,这样 k8s的pod 如果出现out of memory 的话 会写入到 message中去么?答案:会的!内存溢出是系统判断的话就可以看到日志疑问:如果pod因为内存溢出导致pod重启的话,pod的日志也会进入到 /va/log/message 中?答案:不是pod日志 是系统识别某个进程内存溢出了 会显示到message里,因为pod 你可以当做一个进程在_监控message out of memory 日志 告警

使用pycaffe 编写train_test.prototxt和deploy.prototxt_deploy. pro-程序员宅基地

文章浏览阅读346次。write_lenet(trainlmdb, testlmdb, batch_size_train=64, batch_size_test = 10, isdeploy = False): # our version of LeN..._deploy. pro

DEFORM文本模式(4):后处理结果的提取_deform的后处理文件如何打开-程序员宅基地

文章浏览阅读4.1k次,点赞2次,收藏9次。前言之前的文章讲了DEFORM文本模式下的前处理以及计算部分(点击下面的链接可以查看之前的文章),那后处理又怎么办呢?往期文章DEFORM文本模式(1):环境配置DEFORM 文本模式(2):命令的使用DEFORM文本模式(3):批量生成KEY文件及计算DEFORM提供了两种方式来提取后处理结果:文本模式的前处理器和文本模式的后处理器。最粗暴直接的方式就是打开前处理器的文本模式,然后加载DB文件的最后一步,再导出KEY文件,KEY文件中的关键字包括了所有需要的数据。.._deform的后处理文件如何打开

推荐文章

热门文章

相关标签