Java单例模式的线程安全,饿汉和懒汉模式详解

作者:Augustu_ 时间:2022-05-31 16:12:08 

单例模式

创建唯一的一个变量(对象),在类中将构造函数设为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

标签:Java,单例模式
0
投稿

猜你喜欢

  • springboot logback调整mybatis日志级别无效的解决

    2023-05-03 05:36:21
  • 详细解读C++编程中的匿名类类型和位域

    2023-11-02 23:08:18
  • 使用Java实现简单串口通信

    2022-07-27 14:48:52
  • Java接口返回省市区树形结构的实现

    2021-10-16 05:07:05
  • Java精确抽取网页发布时间

    2022-03-24 17:20:11
  • java IO流 之 输出流 OutputString()的使用

    2023-08-11 23:16:30
  • C# Winform下载文件并显示进度条的实现代码

    2022-11-26 04:39:02
  • Android WebView实现网页滚动截图

    2022-12-12 12:13:03
  • 详解在Java的Struts2框架中配置Action的方法

    2023-08-01 11:01:40
  • JAVA SPI特性及简单应用代码实例

    2021-11-11 14:54:54
  • springboot+jwt+springSecurity微信小程序授权登录问题

    2022-10-13 03:36:22
  • 对Java的面对对象编程中对象和引用以及内部类的理解

    2022-02-22 12:11:15
  • Java Annotation注解相关原理代码总结

    2023-11-18 02:13:57
  • Android实现简洁的APP更新dialog数字进度条

    2023-01-29 18:53:39
  • 配置Ant执行Jmeter脚本过程详解

    2023-11-09 22:35:29
  • Spring Boot整合ElasticSearch实现多版本兼容的方法详解

    2021-09-20 18:06:22
  • DevExpress中GridControl列转义的实现方法

    2022-11-10 05:14:31
  • android 控件同时监听单击和双击实例

    2022-11-16 15:45:33
  • java 可变参数详解及实例

    2021-06-01 10:02:42
  • 接口签名怎么用Java实现

    2023-02-18 03:22:10
  • asp之家 软件编程 m.aspxhome.com