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

 更新时间:2022年02月23日 09:44:01   作者:Augustu_  
这篇文章主要为大家详细介绍了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();

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!   

相关文章

  • 关于SpringBoot配置文件加载位置的优先级

    关于SpringBoot配置文件加载位置的优先级

    这篇文章主要介绍了关于SpringBoot配置文件加载位置的优先级,我们也可以通过spring.config.location来改变默认的配置文件位置,项目打包好后,我们可以通过命令行的方式在启动时指定配置文件的位置,需要的朋友可以参考下
    2023-10-10
  • 使用springboot单元测试对weblistener的加载测试

    使用springboot单元测试对weblistener的加载测试

    这篇文章主要介绍了使用springboot单元测试对weblistener的加载测试,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • logback标记日志过滤器MarkerFilter源码解读

    logback标记日志过滤器MarkerFilter源码解读

    这篇文章主要为大家介绍了logback标记日志过滤器MarkerFilter源码解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • java_时间戳与Date_相互转化的实现代码

    java_时间戳与Date_相互转化的实现代码

    本篇文章是对java_时间戳与Date_相互转化的实现代码进行了详细的分析介绍,需要的朋友参考下如下。
    2016-11-11
  • MyBatis 与 Spring 的完美整合方法

    MyBatis 与 Spring 的完美整合方法

    MyBatis 和 Spring 两大框架已经成了 Java 互联网技术主流框架组合,它们经受住了大数据量和大批量请求的考验,在互联网系统中得到了广泛的应用。这篇文章主要介绍了MyBatis 与 Spring 整合,需要的朋友可以参考下
    2018-04-04
  • 基于java查找并打印输出字符串中字符出现次数

    基于java查找并打印输出字符串中字符出现次数

    这篇文章主要介绍了基于java查找并打印输出字符串中字符出现次数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • Struts2在打包json格式的懒加载异常问题

    Struts2在打包json格式的懒加载异常问题

    这篇文章主要为大家详细介绍了Struts2在打包json格式的懒加载异常问题,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • java中如何实现对类的对象进行排序

    java中如何实现对类的对象进行排序

    在本篇文章里小编给各位整理一篇关于java中如何实现对类的对象进行排序知识点内容,有兴趣的朋友们可以学习下。
    2020-02-02
  • Java在重载中使用Object的问题

    Java在重载中使用Object的问题

    这篇文章主要介绍了Java在重载中使用Object的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • javaWeb项目部署到阿里云服务Linux系统的详细步骤

    javaWeb项目部署到阿里云服务Linux系统的详细步骤

    这篇文章主要介绍了javaWeb项目部署到阿里云服务Linux系统,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07

最新评论