多线程学习笔记二 - 多线程与单例模式
单例设计模式与多线程:
设计模式:对问题行之有效的解决方式。其实是一种思想。
单例设计模式:
解决的问题:可以保证一个类在内存中的对象唯一性。
比如对于多个程序使用同一个配置信息对象时,都需要保证对象的唯一性。
如果保证唯一性?
1.不允许其他程序用new创建该类对象。
2.在该类中创建一个本类实例。
3.对外提供一个方法,让其他程序可以获取对象。
实现步骤:
1.私有化该类的构造函数。
2.通过new在本类中创建一个本类对象。
3.定义一个共有的方法,将创建的对象返回。
class Single{private Single(){}Single s = new Single();public void getInstance(){return s;}}
接下来我们要如何调用这个对象呢?通过私有化Single类的构造函数,已经组织了我们new该类,那么就要通过类名.getInstance();的形式获得该类的对象。
所以该方法必须是静态的,因为该方法要返回s,所以s也要是静态的。
class Single{private Single(){}static Single s = new Single();public static void getInstance(){return s;}}
因为s为成员变量,所以我们可以通过类名.s的形式即Single.s的方法获得该类的对象,为什么还有弄一个方法呢?
通过方法的访问可以实现可控性。例如我可以在方法中传一个参数,只要传入的参数满足某个条件才返回s,这叫可控性。
s为Single类的成员变量,我们一般不会吧成员变量暴露出去,原因就是为了可控。
class Single{private Single(){}private static Single s = new Single();public static void getInstance(){return s;}}
以上为单例模式的基本思想。只要在任何一个类中加入以上代码,就能保证该类对象的唯一性。
这种方法类一加载就创建对象。下面介绍另外一种:
class Single{private Single(){}private static Single s = null;public static void getInstance(){if(s == null){s = new Single();return s;}}}
以上这种形式是当调用方法时才创建对象。也称为延迟加载形式。
为了区分两种形式:第一种叫做饿汉式,第二种叫做懒汉式。开发用饿汉式,面试用懒汉式,因为懒汉式包含的知识点比较多。
懒汉式在多线程中会有安全隐患问题。
为什么饿汉式没有呢?
多线程的安全问题发生的原因除了有多个线程共同访问一个共享资源外,还有一个原因就是执行操作共享数据的代码有多条。
而饿汉式只有一条-->return s;所以不会发生安全问题。
解决饿汉式:
class Single{private Single(){}private static Single s = null;public static synchronized void getInstance(){if(s == null){s = new Single();return s;}}}
但是上述解决方法每次调用该方法的时候都会判断锁,降低了效率。为了提高效率我们对该代码进行改写,不用同步函数锁,改用同步块锁。
class Single{private Single(){}private static Single s = null;public static void getInstance(){if(s == null){synchronized(Single.class){//注意:此方法为静态方法不能用this;if(s == null){s = new Single();return s;}}}}}
解释:使用同步块锁是为了解决线程安全问题,多加一次判断是为了提高效率。
综上所述:开发还是用饿汉式好。
转载于:https://www.cnblogs.com/snoopylovefiona/p/4684685.html
多线程学习笔记二 - 多线程与单例模式相关推荐
- Java之多线程学习笔记五 —— 多线程模拟龟兔赛跑
Java之多线程学习笔记五 -- 多线程模拟龟兔赛跑 参考教程B站狂神https://www.bilibili.com/video/BV1V4411p7EF package pers.ylw.less ...
- java多线程学习笔记--一.多线程的基础知识
需要学习的知识 多线程基础知识讲解 参考索隆和jim的视频,以及自己做的笔记 导读 为了充分利用CPU资源,人们发明了线程和进程 进程 由来:在单核cpu的时期,为了方便操作把一系列的操作的指令写下来 ...
- JAVA高并发学习笔记(二) 多线程基础
1.1什么是线程 线程是进程(程序在计算机上的一次执行活动)内的执行单元 进程是以独立于其他进程的方式运行的,进程间是互相隔离的.一个进程无法直接访问另一个进程的数据.进程的资源诸如内存和CPU时间片 ...
- Java并发编程学习笔记(二)多线程的理解及多线程的优点
多线程的优点 原文:http://tutorials.jenkov.com/java-concurrency/benefits.html 作者:Jakob Jenkov 翻译:古圣昌 ...
- java多线程学习笔记。
java多线程学习笔记 线程的优缺点: 多线程的好处: 充分利用多处理核心,提高资源的利用率和吞吐量. 提高接口的响应效率,异步系统工作. 线程的风险: 安全危险(竞争条件):什么坏事都没有发生.在没 ...
- 多线程学习笔记20210121
多线程学习笔记 线程简介 为什么要有线程 用一只手做事情显然是效率比较低的 ,两只手,再来一个人 合作去完成某一件事情显然就会效率高了. 就是在程序执行中 出现了 供需不平衡 了 为了使程序更快,更高 ...
- java 编程思想 多线程学习笔记
java 编程思想 多线程学习笔记 一.如何创建多线程? 1.继承 java.lang.Thread 类 2.实现 java.lang.Runnable 接口 3.Callable接口 总之,在任何线 ...
- Java多线程学习(二)synchronized关键字(1)
转载请备注地址: https://blog.csdn.net/qq_34337272/article/details/79655194 Java多线程学习(二)将分为两篇文章介绍synchronize ...
- java 多线程语法_Java基础语法之多线程学习笔记整理
众所周知,利用好多线程机制,可以大大提高系统整体的并发能力以及性能,而且线程间的切换和调度的成本小.因此,多线程是Java学习者必须掌握的语法重点.本文为大家整理了进程和线程.实现多线程方式.设置和获 ...
最新文章
- python networkx模块,python复杂网络处理模块networkx
- Science公布:全世界最前沿的125个科学问题
- Struts 2+Spring 3+Hibernate 3.3 在MyEclipse 10环境下的整合配置
- python打开excel的函数-Python读取excel文件中带公式的值的实现
- YUIDoc的使用方法小结
- [小技巧]PicGo、Gitee和Typora构建在线图床
- html标签体,HTMLCSS基础-html标签的实体
- java opencv磨皮算法_使用OPENCV简单实现具有肤质保留功能的磨皮增白算法
- 2021杭州·云栖大会来了!门票免费预约!
- 第 5-5 课:线程安全——synchronized 和 ReentrantLock + 面试题
- Linux LVM简明教程
- 无废话Git——本地服务器提交撤销
- TCP三次握手与DDOS***原理
- Python:Django 项目中可用的各种装备和辅助
- sklearn实践之——计算回归模型的四大评价指标(explained_variance_score、mean_absolute_error、mean_squared_error、r2_score)
- vray uneal插件试用版 license 安装过程
- 网络工程师之网络规划
- “大灯”到底指近光灯还是远光灯?
- 智慧养老模式和智慧养老系统
- 《深入浅出WPF》——XAML语法及基础知识
热门文章
- 客户端更新功能实现_exlive1.0|监控客户端功能更新
- C#求两个日期之间相差的天数和当前日期+30天插入数据库
- java poi教程_Java完成POI的功能
- 充值后的充值金额提交到账户金额中
- 计算机组成原理李玉玲,2005年高等教育国家级教学成果奖初审结果公告-山东大学.DOC...
- 计算机管理里面蓝牙音频有问题,win10更新到1903版,蓝牙音频存在问题,微软终于给出了解决方法-win10更新...
- 刷新存储器的容量单位是什么_什么是PLC?PLC的选型原则是什么?
- 疯狂python讲义pdf_如何自学成Python大神?这份学习宝典火爆 IT 圈!
- enlink请输入正确服务器地址,MXC极域有什么新的消息?
- 怎么样才显示暗=安装好了mysql_linux mysql安装