最近一直在学习多线程,在学习过程中遇到了关于单例模式的多线程安全问题,内容如下:

  一:首先什么是单例模式

  单例模式具有的三要点:

  • 一个类只能有一个实例;
  • 必须是由它自己创建的这个实例;
  • 它必须自行向外界提供这个实例;

  优点:

  1. 节以保证访问的对象实例的唯一性;
  2. 对于经常使用的类来说设计出单例模式可以节省资源,比如工具类;

  二:单例模式的几种写法  

/**
* 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单例模式学习笔记的更多相关文章

  1. java 单例模式学习笔记

    1.单例模式概述 单例模式就是确保类在内存中只有一个对象,该实例必须自动创建,并且对外提供. 2.优缺点 优点:在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模 ...

  2. Android(java)学习笔记267:Android线程池形态

    1. 线程池简介  多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.     假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...

  3. Android(java)学习笔记211:Android线程池形态

    1. 线程池简介  多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.     假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...

  4. 尚学堂JAVA基础学习笔记

    目录 尚学堂JAVA基础学习笔记 写在前面 第1章 JAVA入门 第2章 数据类型和运算符 第3章 控制语句 第4章 Java面向对象基础 1. 面向对象基础 2. 面向对象的内存分析 3. 构造方法 ...

  5. 20145213《Java程序设计学习笔记》第六周学习总结

    20145213<Java程序设计学习笔记>第六周学习总结 说在前面的话 上篇博客中娄老师指出我因为数据结构基础薄弱,才导致对第九章内容浅尝遏止地认知.在这里我还要自我批评一下,其实我事后 ...

  6. [原创]java WEB学习笔记95:Hibernate 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  7. java JDK8 学习笔记——助教学习博客汇总

    java JDK8 学习笔记——助教学习博客汇总 1-6章 (by肖昱) Java学习笔记第一章——Java平台概论 Java学习笔记第二章——从JDK到IDEJava学习笔记第三章——基础语法Jav ...

  8. java JDK8 学习笔记——第16章 整合数据库

    第十六章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API中的接口会有数据库厂商操作,称为JDBC驱动程 ...

  9. [原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

随机推荐

  1. How to bypass Win10 logon password?

    Usually we will use LiveView or VFC to "boot up" the evidence files acquired from suspect' ...

  2. 请问:关于织梦dedecms点击导航上的父栏目进去默认显示第一个子栏目的列表的问题

    要设置织梦dedecms点击导航上的父栏目进去默认显示第一个子栏目的列表, 就按照如下图所示的方法进行操作,为什么 点击导航上的父栏目出现死循环呢, 根本浏览不了网页. 请各位大神指点指点,为什么点击 ...

  3. jquery 图片自动无缝滚动

    <!DOCTYPE html><html><head> <meta charset="utf-8"> <meta http-e ...

  4. 邓_Jquery测试题

    一.Jquery测试题 下面哪种不是jquery的选择器?(单选)A.基本选择器 B.后代选择器 C.类选择器 D.进一步选择器考点:jquery的选择器 (C) 当DOM加载完成后要执行的函数,下面 ...

  5. As a Start - 毫厘之间,宇宙之外

    序 突然想聊聊多重宇宙——多重宇宙,这听上去像是一个科幻概念,但是严肃思考这一个问题时,将会带我们进入一个全新的格局和世界. 对宇宙学家而言,研究多重宇宙并不仅仅是为了猜测平行世界里某一历史事件是否有 ...

  6. Python 3 利用 Dlib 19.7 和 sklearn机器学习模型 实现人脸微笑检测

    0.引言  利用机器学习的方法训练微笑检测模型,给一张人脸照片,判断是否微笑:   使用的数据集中69张没笑脸,65张有笑脸,训练结果识别精度在95%附近: 效果: 图1 示例效果 工程利用pytho ...

  7. 【编程技巧】java不使用第三个变量处理两个变量的交换

    public class SwapNum {public static void main(String[] args) {doSwapNum();}public static void doSwap ...

  8. Hadoop问题:chmod 0700 of directory /var/lib/apt/lists/

    问题描述: apt-get update W: chmod of directory /: Operation not permitted) E: Could not open : Permissio ...

  9. u8g2库的相关资料

    2017-12-1309:13:32更新51论坛上的帖子,大神自己写的库文件,待调试! http://www.51hei.com/bbs/forum.php?mod=viewthread&ti ...

  10. python_如何快速找打字典中公共key

    场景实例: 西班牙足球联赛,每轮球员进球统计: 第一轮:{'1':1,'2':4,'5':2,'7':3} 第一轮:{'2':1,'5':4,'6':2,'3':3} 第一轮:{'1':1,'4':4 ...