java单例模式学习笔记
最近一直在学习多线程,在学习过程中遇到了关于单例模式的多线程安全问题,内容如下:
一:首先什么是单例模式
单例模式具有的三要点:
- 一个类只能有一个实例;
- 必须是由它自己创建的这个实例;
- 它必须自行向外界提供这个实例;
优点:
- 节以保证访问的对象实例的唯一性;
- 对于经常使用的类来说设计出单例模式可以节省资源,比如工具类;
二:单例模式的几种写法
/**
* 1:懒汉模式
* 缺点:存在线程安全问题
* @author 丁**
*
*/
class DanLiModel {
private static DanLiModel instance = null;
private DanLiModel(){};//外界就不能构造新的对象
public static DanLiModel getInstance(){
if(instance == null){
instance = new DanLiModel();
}
return instance;
}
}
/**
* 2:饿汉模式
* 不存在线程安全问题
* @author 丁**
*
*/
class DanLiModel1 {
private static DanLiModel1 instance = new DanLiModel1();
private DanLiModel1(){};
public static DanLiModel1 getInstance(){
return instance;
}
}
那么懒汉模式的线程安全问题何修改:
//本来可以这样使用:
synchronized public static DanLiModel3 getInstance(){
if(instance == null){
instance = new DanLiModel3();
}
return instance;
}
//但是synchronized同步方法的性能不高,应该尽量减少它的作用域;
所以在这里使用了双重检查机制保证线程安全的同时尽量减少synchronized的作用域,提高性能:
/**
* 第一层检查:并不是每次有新的线程进入都得同步一次,如果已经实例化过对象了,就直接返回实例;
* 第二层检查:进入同步块后创建一个新的对象
* 关于同步锁:
* 每一个对象都有一个同步锁;
* 锁可以保护代码片段,保证了任何时刻只有一个线程执行被保护的代码;
* 对于非 static方法,同步锁就是该方法所属类的对象
* 对于static方法,同步锁就是该方法所属的类的字节码对象:DanLiModel3.class
* 优点:解决了原来的线程安全问题
*/
class DanLiModel3{
private static DanLiModel3 instance = null;
private DanLiModel3(){};//外界就不能构造新的对象
public static DanLiModel3 getInstance(){
if(instance == null){
synchronized(DanLiModel3.class){
if(instance == null){
instance = new DanLiModel3();
}
}
}
return instance;
}
}
ps:
过完年就要去找工作了,打算空闲的这些天把线程,集合,数据结构给补补,然后将实战项目做完(可以当做面试展示的内容之一啦)
,最后在网上看看常问的面试题目。哎,我这个小菜鸟!
java单例模式学习笔记的更多相关文章
- java 单例模式学习笔记
1.单例模式概述 单例模式就是确保类在内存中只有一个对象,该实例必须自动创建,并且对外提供. 2.优缺点 优点:在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模 ...
- Android(java)学习笔记267:Android线程池形态
1. 线程池简介 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力. 假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...
- Android(java)学习笔记211:Android线程池形态
1. 线程池简介 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力. 假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...
- 尚学堂JAVA基础学习笔记
目录 尚学堂JAVA基础学习笔记 写在前面 第1章 JAVA入门 第2章 数据类型和运算符 第3章 控制语句 第4章 Java面向对象基础 1. 面向对象基础 2. 面向对象的内存分析 3. 构造方法 ...
- 20145213《Java程序设计学习笔记》第六周学习总结
20145213<Java程序设计学习笔记>第六周学习总结 说在前面的话 上篇博客中娄老师指出我因为数据结构基础薄弱,才导致对第九章内容浅尝遏止地认知.在这里我还要自我批评一下,其实我事后 ...
- [原创]java WEB学习笔记95:Hibernate 目录
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- java JDK8 学习笔记——助教学习博客汇总
java JDK8 学习笔记——助教学习博客汇总 1-6章 (by肖昱) Java学习笔记第一章——Java平台概论 Java学习笔记第二章——从JDK到IDEJava学习笔记第三章——基础语法Jav ...
- java JDK8 学习笔记——第16章 整合数据库
第十六章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API中的接口会有数据库厂商操作,称为JDBC驱动程 ...
- [原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
随机推荐
- phpstudy本地搭建域名访问
http://blog.csdn.net/camillezj/article/details/54694554 步骤如下: 一.hosts配置: 1.用编辑器打开hosts文件,位置:C:\Windo ...
- 版本控制——TortoiseSVN (4)多版本并行开发 B
=================================版权声明================================= 版权声明:原创文章 禁止转载 请通过右侧公告中的“联系邮 ...
- J.U.C JMM. pipeline.指令重排序,happen-before(续MESI协议)
缓存(Cache) CPU的读/写(以及取指令)单元正常情况下甚至都不能直接访问内存——这是物理结构决定的:CPU都没有管脚直接连到内存.相反,CPU和一级缓存(L1 Cache)通讯,而 ...
- python_6_字符串
什么是字符串? --一般用户输入数据和一堆有意义或者没有意义的文字符号组合 对字符串有哪些操作? --字符串本身不能修改,可以切片,可以读取 -- .capitalize() ...
- BSA Network Shell系列-nsh命令
nsh nsh命令软链接到zsh,直接运行nsh可进入Network Shell,所有的Network Shell命令都需要运行nsh进入Network Shell执行 1 使用cd命令访问远程主机和 ...
- Arrays.sort解析
Arrays.sort()解读 在学习了排序算法之后, 再来看看 Java 源码中的, Arrays.sort() 方法对于排序的实现. 都是对基本数据类型的排序实现, 下面来看看这段代码: Arra ...
- selenium-java web自动化测试工具
本篇文章由来,这两天整理了下自己经常使用而且很熟练的项目,今天突然想起漏了一个,补上了,但想到还没对应的博客,那就写一个简单的 我经常使用且相对熟练的部分技术如下(不知道算不算各位大神眼中的辣鸡): ...
- ClearCase创建视图与基本命令
1.创建和设置view cleartool mkview -tag King_dev /home/King/King_dev.vws cleartool setview King_dev 2.删除V ...
- 微信H5支付网络环境未能通过安全验证,请稍后再试(获取终端ip )
在写微信H5支付的时候需要获取终端IP使用官方的方法是不对的报错如下: 故重写一个:如下 function get_client_ip(){ if(getenv('HTTP_CLIENT_IP') & ...
- awk的+=用法
awk增加统计列值为增加列数或进行运行结果统计,使用符号 + =.增加的结果赋给符号左边变量值,增加到变量的域在符号右边.例如将 $ 1加入变量total,表达式为toatl+=$1.列值增加很有用. ...