Java单例模式的线程安全,饿汉和懒汉模式详解
作者:Augustu_ 发布时间:2022-05-31 16:12:08
标签:Java,单例模式
单例模式
创建唯一的一个变量(对象),在类中将构造函数设为protected或者private(析构函数设为相对应的访问权限),故外部不能实例化对象,再提供访问它的一个全局访问点,即定义一个static函数,返回类中唯一构造的一个实例对象。任何条件下,保证只有一个实例对象,这就是单例。
1.线程安全:在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。
2..懒汉模式:在系统运行中,实例并不存在,只有当需要的时候才创建并使用实例。(需要考虑线程安全)可以使用静态局部变量(c++11及以上)或者需要加锁。
//如果是多线程 需要加锁
class MultiThreadSingleton
{
public:
~MultiThreadSingleton()
{
cout << "~MultiThreadSingleton()" << endl;
}
static MultiThreadSingleton* getInstance()
{
if(instance == nullptr)
{
//初次创建时加锁
pthread_mutex_lock(&mutex);
instance = new MultiThreadSingleton();
pthread_mutex_unlock(&mutex);
}
return instance;
}
void SingletonOP()
{
cout << "SingletonOP!" << endl;
}
private:
MultiThreadSingleton()
{
pthread_mutex_init(&mutex,NULL);
cout << "MultiThreadSingleton()" << endl;
}
static pthread_mutex_t mutex;
static MultiThreadSingleton* instance;
};
//懒汉模式 即需要的时候才去实例化对象
MultiThreadSingleton* MultiThreadSingleton::instance = nullptr;
pthread_mutex_t MultiThreadSingleton::mutex;
//------------
MultiThreadSingleton* sig3 = MultiThreadSingleton::getInstance();
sig3->SingletonOP();
delete sig3;
//局部变量懒汉模式
static MultiThreadSingleton* getInstance()
{
//局部变量
static MultiThreadSingleton localInstance;
return &localInstance;
}
//-----------------------------
//懒汉局部变量
MultiThreadSingleton* sig4 = MultiThreadSingleton::getInstance();
MultiThreadSingleton* sig5 = MultiThreadSingleton::getInstance();
sig4->SingletonOP();
if(sig4 == sig5) cout << "Test!" << endl;
3.饿汉模式:指系统一运行,就初始化创建实例,当需要的时候,直接调用就行。(本身就是线程安全)
1.二者的主要区别就是创建实例的时间不同
2.使用懒汉单例时,推荐使用内部静态变量的懒汉单例,代码量少。
3.懒汉式是空间换时间,适应于访问量较少;饿汉式是时间换空间,适应于访问量较大或者线程较多时。
class MultiThreadSingleton
{
public:
~MultiThreadSingleton()
{
cout << "~MultiThreadSingleton()" << endl;
}
static MultiThreadSingleton* getInstance()
{
// if(instance == nullptr)
// {
// return new MultiThreadSingleton();
// }
return instance;
}
void SingletonOP()
{
cout << "SingletonOP!" << endl;
}
private:
MultiThreadSingleton()
{
cout << "MultiThreadSingleton()" << endl;
}
static MultiThreadSingleton* instance;
};
//饿汉模式 即在类加载时时就创建对象,适合访问量较大的时候,用空间换时间
MultiThreadSingleton* MultiThreadSingleton::instance = new MultiThreadSingleton();
来源:https://blog.csdn.net/guslee/article/details/123047967


猜你喜欢
- 1.SQL注入:程序向后台数据库传递SQL时,用户提交的数据直接拼接到SQL语句中并执行,从而导入SQL注入攻击。字符型注入:黑色部分为拼接
- 前言本文的记录如何用CustomPaint、GestureDetector实现一个进度条控件。首先需要说明的是 flutter Materi
- 首先,良好的编码规范非常重要。在 java 程序中,访问速度、资源紧张等问题的大部分原因,都是代码不规范造成的。单例的使用场景单例模式对于减
- 一、定义一个配置类,自定义RedisTemplate的序列化方式@Configurationpublic class RedisConfig
- 前言 安卓系统中,Button是程序和用户进行交互的一个重要控件,今天我们就来简单的对Button进行学习,其中Bu
- 实践过程效果代码public partial class Form1 : Form{ public Form1()
- SpringBoot 2.1.4 错误处理机制springboot的自动配置中帮我们配置了相关的错误处理组件,例如访问一个不存在的页面,就会
- 什么是ShiroApache Shiro是一个功能强大且易于使用的Java安全框架,它执行身份验证、授权、加密和会话管理。借助Shiro易于
- 一:背景1. 讲故事在前一篇大内存排查中,我们看到了Dictionary正在做扩容操作,当时这个字典的count=251w,你把字典玩的66
- HttpClient使用post方法提交数据 源代码:package post;import Java.io.IOException;imp
- 今天看到EOE问答里面有这“[Android 界面]NotificationManager 如何使用Bitmap做图标”这样一个问题,在论坛
- 一.相关知识:Java多线程程序设计到的知识:(一)对同一个数量进行操作(二)对同一个对象进行操作(三)回调方法使用(四)线程同步,死锁问题
- 现在Java的大部分项目都是基于Maven, 在Maven项目中使用Selenium2. 非常简单。 首先你需要配置好
- 引言本文是关于Spark优化性能与内存使用的最佳实践,翻译整理自Tuning - Spark 3.3.2 Documentation。由于s
- 1.什么是逆向工程mybaits需要程序员自己编写sql语句,mybatis官方提供逆向工程 可以针对单表自动生成mybatis执行所需要的
- 1、前言 最近做项目需要用到监测网速及流量,我经过百度和墙内谷歌都没能快速发现监测IPV6流量和网速的用例;也经过自己的一番查询和调试,浪
- 我的电脑环境win10vscode 1.36.1vscode安装插件安装完这个插件后会提示你安装 platformIOCore,按照提示安装
- 使用C#在不借助第三方插件的情况下将Excel中的数据转换成DataSet/// <summary>
- 获取缓存大小接口主要这里的方法已经和7.0不兼容了。import android.app.usage.UsageStats;import a
- Android资源文件大致可以分为两种:第一种是res目录下存放的可编译的资源文件:这种资源文件系统会在R.java里面自动生成该资源文件的