Singleton多种实现方式的在多线程情况下的优缺点
一、饿汉式
缺点:不能懒加载
// 不能懒加载
public class SingletonObject1 { private static final SingletonObject1 instance = new SingletonObject1(); private SingletonObject1(){ } public static SingletonObject1 getInstance(){
return instance;
}
}
二、懒汉式(线程不安全)
public class SingletonObject2 {
private static SingletonObject2 instance = null;
private SingletonObject2(){
}
public static SingletonObject2 getInstance(){
// 线程不安全模式
if (instance == null)
instance = new SingletonObject2();
return SingletonObject2.instance;
}
}
三、懒汉式(线程安全,效率低)
public class SingletonObject3 {
private static SingletonObject3 instance = null;
private SingletonObject3(){
}
// 串行执行,效率低下
public static synchronized SingletonObject3 getInstance(){
if (instance == null)
instance = new SingletonObject3();
return SingletonObject3.instance;
}
}
四、懒汉式(线程安全,效率高,但是有空指针异常)
public class SingletonObject4 {
private static SingletonObject4 instance = null;
private SingletonObject4(){
}
// 双重检查机制,严格单例,解决了懒加载的问题,但是也带来了问题:空指针异常
public static SingletonObject4 getInstance(){
if (instance == null){
synchronized (SingletonObject4.class){
if (instance == null)
instance = new SingletonObject4();
}
}
return SingletonObject4.instance;
}
}
五、懒汉式(解决四的问题,禁止指令重排序,加volatile关键字)
public class SingletonObject5 {
private static volatile SingletonObject5 instance = null;
private SingletonObject5(){
}
// 双重检查机制,严格单例,解决了懒加载的问题,但是也带来了问题:空指针异常
public static SingletonObject5 getInstance(){
if (instance == null){
synchronized (SingletonObject5.class){
if (instance == null)
instance = new SingletonObject5();
}
}
return SingletonObject5.instance;
}
}
六、内部静态类的更加优雅的方式
public class SingletonObject6 {
private SingletonObject6(){
}
private static class InstanceHolder{
private final static SingletonObject6 instance = new SingletonObject6();
}
public static SingletonObject6 getInstance(){
return InstanceHolder.instance;
}
}
Singleton多种实现方式的在多线程情况下的优缺点的更多相关文章
- Java之HashMap在多线程情况下导致死循环的问题
PS:不得不说Java编程思想这本书是真心强大.. 学习内容: 1.HashMap<K,V>在多线程的情况下出现的死循环现象 当初学Java的时候只是知道HashMap<K,V& ...
- Dictionary在多线程情况下
Add时出错 错误信息: Index was outside the bounds of the array. 详细信息: at System.Collections.Generic.Dictiona ...
- 多线程情况下HashMap死循环的问题
1.多线程put操作后,get操作导致死循环. 2.多线程put非null元素后,get操作得到null值. 3.多线程put操作,导致元素丢失. 死循环场景重现 下面我用一段简单的DEMO模拟Has ...
- Java面试题之在多线程情况下,单例模式中懒汉和饿汉会有什么问题呢?
懒汉模式和饿汉模式: public class Demo { //private static Single single = new Single();//饿汉模式 private static S ...
- 数据库SQL调优的几种方式 EFcore读的情况下使用 AsNoTracking非跟踪查询
不要用GUID 当主键 没有规律 可以用雪花ID DBA 优化法则 硬件资源是根本,DBA是为了充分利用硬件资源 一般清空下可以不使用外键 可以提高性能 合理使用临时表 临时表分页; 一些查询语句加w ...
- 关于多线程情况下Net-SNMP v3 版本导致进程假死情况的跟踪与分析
1.问题描述 在使用net-snmp对交换机进行扫描的时候经常会出现进程假死的情况(就是进程并没有死掉,但是看不到它与外界进行任何的数据交互).这时候不知道进程内部发生了什么,虽然有日志信息,但进程已 ...
- 【spring Boot】spring boot获取资源文件的三种方式【两种情况下】
首先声明一点,springboot获取资源文件,需要看是 1>从spring boot默认的application.properties资源文件中获取 2>还是从自定义的资源文件中获取 带 ...
- C#多线程环境下调用 HttpWebRequest 并发连接限制
C#多线程环境下调用 HttpWebRequest 并发连接限制 .net 的 HttpWebRequest 或者 WebClient 在多线程情况下存在并发连接限制,这个限制在桌面操作系统如 win ...
- 在多线程环境下使用HttpWebRequest或者调用Web Service(连接报超时问题)
.net 的 HttpWebRequest 或者 WebClient 在多线程情况下存在并发连接限制,这个限制在桌面操作系统如 windows xp , windows 7 下默认是2,在服务器操作 ...
随机推荐
- word中如何只修改英文的颜色
替换->更多->使用通配符,查找[a-zA-Z],替换为^&,字体选红色
- 浅谈基于Intellij IDEA Maven的配置与使用
在java开发中,引入jar包的方式从种类上划分,可分为自动导入和手动导入,然而,手动导入繁琐,不是很适合当前开发模式,手动导入也被自动导入所取代. 当前,Maven和Gradle是比较主流的自动导入 ...
- 用VS2017进行移动开发(C#、VB.NET)——OfflineCameraButton控件,Smobiler移动开发
OfflineCameraButton控件 一. 样式一 我们要实现上图中的效果,需要如下的操作: 从工具栏上的“Smobiler Components”拖动一个OfflineCam ...
- winform中使用委托进行窗体之间的传值
一.传统的方式 创建一个公共数据资源类,用于存储窗体2的TextBox的值: public class ComValue { public static string Txtvalue { get; ...
- C# ADO.NET的SqlDataReader对象,判断是否包含指定字段
在使用ado.net的SqlDataReader对象时,如果SqlDataReader实例对象中没有对应的字段,则会在那一行报错.而SqlDataReader类又没有判断是否存在指定字段的方法,怎么办 ...
- 第二章:shiro身份验证
身份验证,即在应用中谁能证明他就是他本人.一般提供如他们的身份ID一些标识信息来表明他就是他本人,如提供身份证,用户名/密码来证明. 在shiro中,用户需要提供principals (身份)和cre ...
- Biorhythms(poj1006+中国剩余定理)
Biorhythms Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 117973 Accepted: 37026 Des ...
- Yii2设计模式——注册树模式
应用举例 在Yii.php中: <?php class ServiceLocator extends Component { //保存实例化的对象,每个对象都是单例,且有唯一string类型的I ...
- vue element-ui 分页组件封装
<template> <el-pagination @size-change="handleSizeChange" @current-change="h ...
- 长图的展开与收起(Android)
前言: 在app的文章中,经常会夹杂着一些特别长的长图.在阅读的时候需要滑动很久才能看图片下方的文字,因此对于长图只展示图片上面一部分,并且可以展开这个功能是很重要的. 效果: 基本思路: 利用sca ...