【Java面试指北】单例模式
单线程下的单例模式:
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton()
}
return instance;
}
}
几个关键点:
- static 修饰:表名属于类而不是类对象,不会每生成一个新的类对象都新生成一份。并且可以在不创建类对象的情况下直接调用。
- 为什么构造函数是
private类型?不然呢,开放了构造函数还怎么单例。 - 为什么不把单例的逻辑放到构造函数中?在
Singleton()中调用Singleton()么,那不是死循环了。 - 类中的单例变量是
private类型的,不能直接访问,要通过getInstance()来获取。
多线程下的单例模式:
和单线程有什么区别?
- 需要考虑线程安全问题
- 需要考虑效率问题
方法一:
只需要给 getInstance 方法添加 synchronized 关键字即可。
public static synchronized Singleton getInstance() {
问题:每次访问都要同步,会降低性能。
方法二:
双重检查锁定
public class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton()
}
}
}
return instance;
}
}
关键点:
- 性能优化:将
synchronized放到实际创建时,只有第一次实例未创建才会同步,后续都不会。 - 为什么要双重检查
instance==null?第一次检查完,有可能被别的线程先创建了。 - 为什么
instance要用volatile修饰?- 因为
new Singleton()不是一个单一的操作,会存在指令重排的问题。 - 1、为
instance分配内存空间。2、初始化instance。3、将instance指向分配的内存地址。 - 如果指令重拍后,变为了 1-3-2,那么其他线程可能会拿到一个还没初始化的
instance。
- 因为
- 为什么有了
volatile还需要synchronized?- 因为
volatile不保证原子性。
- 因为
【Java面试指北】单例模式的更多相关文章
- 【Java面试指北】Exception Error Throwable 你分得清么?
读本篇文章之前,如果让你叙述一下 Exception Error Throwable 的区别,你能回答出来么? 你的反应是不是像下面一样呢? 你在写代码时会经常 try catch(Exception ...
- Java面试指北!13个认证授权常见面试题/知识点总结!| JavaGuide
大家好,我是 Guide哥!端午已过,又要开始工作学习啦! 我发现有很多小伙伴对认证授权方面的知识不是特别了解,搞不清 Session 认证.JWT 以及 Cookie 这些概念. 所以,根据我根据日 ...
- 【Java面试指北】反射(1) 初识反射
如果你被问到:什么是反射?为什么需要反射.以及反射的应用?你会如何回答呢? 本篇会带大家初识反射,了解反射概念和基本应用.反射的原理以及深入源码的探究将会在后面几篇介绍. 一.什么是反射? 要理解什么 ...
- 2019 年 Java 最新面试指南共 80 题,赶快收藏起来吧!
2019 年 Java 最新面试指南共 80 题,赶快收藏起来吧! http://blog.zh66.club/index.php/archives/116/
- 慕课网:剑指Java面试-Offer直通车视频课程
慕课网:剑指Java面试-Offer直通车视频课程,一共有10个章节. 目录结构如下: 目录:/2020036-慕课网:剑指Java面试-Offer直通车 [6G] ┣━━第10章 Java常用类库与 ...
- 转:最近5年133个Java面试问题列表
最近5年133个Java面试问题列表 Java 面试随着时间的改变而改变.在过去的日子里,当你知道 String 和 StringBuilder 的区别就能让你直接进入第二轮面试,但是现在问题变得越来 ...
- java面试宝典(蓝桥学院)
Java面试宝典(蓝桥学院) 回答技巧 这套面试题主要目的是帮助那些还没有java软件开发实际工作经验,而正在努力寻找java软件开发工作的学生在笔试/面试时更好地赢得好的结果.由于这套试题涉及的范围 ...
- java面试和笔试大全 分类: 面试 2015-07-10 22:07 10人阅读 评论(0) 收藏
2.String是最基本的数据类型吗? 基本数据类型包括byte.int.char.long.float.double.boolean和short. java.lang.String类是final类型 ...
- 近5年133个Java面试问题列表
Java 面试随着时间的改变而改变.在过去的日子里,当你知道 String 和 StringBuilder 的区别就能让你直接进入第二轮面试,但是现在问题变得越来越高级,面试官问的问题也更深入. 在我 ...
- java面试笔试大汇总
java面试笔试题大汇总5 JAVA相关基础知识 1.面向对象的特征有哪些方面 1.抽象:2.继承:3.封装:4. 多态性: 2.String是最基本的数据类型吗? 基本数据类型包括byte.int. ...
随机推荐
- Java 常用类 String的使用---测试
1 package com.bytezero.stringclass; 2 3 import org.junit.Test; 4 5 /** 6 * 7 * 8 * 9 * @author Bytez ...
- C++ //deque容器 构造函数 //deque赋值操作 //deque大小操作 //重新指定大小 //deque没有容量概念 //deque插入和删除 //deque 容器数据存取 ////deque 排序 sotr算法
1 //deque容器 构造函数 //deque赋值操作 //deque大小操作 //重新指定大小 2 //deque没有容量概念 //deque插入和删除 //deque 容器数据存取 3 //// ...
- vmware完全卸载 防止出现各种问题治标不治本
首先打开系统盘根目录,搜索" VMware ",把搜到的都删掉,去控制面板那里卸载掉VMware 打开管理(右键"我的电脑"),管理打开设备管理器," ...
- Codeforces Round 113 (Div. 2)E. Tetrahedron(dp、递推)
目录 题面 链接 题意 题解 代码 总结 题面 链接 E. Tetrahedron 题意 从一个顶点出发走过路径长度为n回到出发点的方案总数 题解 考虑dp \(f[i][0|1|2|3]\):走了i ...
- CPNtools协议建模安全分析--ML语言之颜色集定义(六)
之前一直在怀疑我是不是因为对CPN Tools的原理结构还是不够理解,对Petri网的还没有弄清楚,越往后面看这种质疑越来越严重. 之前说CPN Tools在对称和非对称算法中不能形式化的问题,后续看 ...
- 摆脱鼠标系列 - vscode - Esc 返回时候 强制显示英文输入法 - ahk 脚本 - autoHotKey
为什么 摆脱鼠标系列 - vscode - Esc 返回时候 强制显示英文输入法 切换网页的时候,回来还是搜索输入法,就想到按esc,直接强制英文输入法 之前vim插件里面 用了一个 im-selec ...
- Template String Converter - 字符串中加变量 自动将单引号变换 - vscode插件
Template String Converter - 字符串中加变量 自动将单引号变换 - vscode插件
- docker 资料整理
docker 资料整理 基础概念 docker deamon 守护系统:简单理解就是docker的软件系统,管控这容器的开关. docker容器:从镜像启动到内存中形成动态运行,从编程角度,如果镜像是 ...
- KTL 最新支持Qt5窗口编程,一个支持C++14编辑公式的K线技术工具平台
K,K线,Candle蜡烛图. T,技术分析,工具平台 L,公式Language语言使用c++14,Lite小巧简易. 项目仓库:https://github.com/bbqz007/KTL 国内仓库 ...
- Linux快速入门(五)Linux系统管理
top top命令相当于任务管理器.在top命令中,可以使用M,将进程列表按内存使用排序,使用P将进程列表按照CPU的使用情况排序,输入q退出. (1)第一行是任务队列信息,显示系统时间.运行时间.当 ...