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异步处理@NotBlank或@NotNull注释校验不生效问题

    springboot异步处理@NotBlank或@NotNull注释校验不生效问题

    这篇文章主要介绍了springboot异步处理@NotBlank或@NotNull注释校验不生效问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • java算法导论之FloydWarshall算法实现代码

    java算法导论之FloydWarshall算法实现代码

    这篇文章主要介绍了算法导论之FloydWarshall算法实现代码的相关资料,需要的朋友可以参考下
    2017-05-05
  • SpringBoot整合atomikos实现跨库事务的详细方案

    SpringBoot整合atomikos实现跨库事务的详细方案

    这篇文章主要介绍了SpringBoot整合atomikos实现跨库事务,业务主要涉及政府及企业且并发量不大,所以采用XA事务,虽然性能有所损失,但是可以保证数据的强一致性,需要的朋友可以参考下
    2022-06-06
  • Java基于NIO实现群聊系统

    Java基于NIO实现群聊系统

    这篇文章主要为大家详细介绍了Java基于NIO实现群聊系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Java集合中的LinkedHashSet源码解读

    Java集合中的LinkedHashSet源码解读

    这篇文章主要介绍了Java集合中的LinkedHashSet源码解读,在LinkedHashMap中,双向链表的遍历顺序通过构造方法指定,如果没有指定,则使用默认顺序为插入顺序,即accessOrder=false,需要的朋友可以参考下
    2023-12-12
  • springboot dynamic多数据源demo以及常见切换、事务的问题

    springboot dynamic多数据源demo以及常见切换、事务的问题

    这篇文章主要介绍了springboot dynamic多数据源demo以及常见切换、事务的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • 浅谈一下Java中的内存模型JMM

    浅谈一下Java中的内存模型JMM

    这篇文章主要介绍了浅谈一下Java中的内存模型JMM,JMM,全程是 Java Memory Model ,直译就是 Java 内存模型,根据这个名字,可以知道它是 Java 设计用来管理内存的一个模型,需要的朋友可以参考下
    2023-08-08
  • Java8如何通过Lambda处理List集合

    Java8如何通过Lambda处理List集合

    这篇文章主要介绍了java8如何通过Lambda处理List集合,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • 使用MUI框架构建App请求http接口实例代码

    使用MUI框架构建App请求http接口实例代码

    下面小编就为大家分享一篇使用MUI框架构建App请求http接口实例代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • Java实现验证文件名有效性的方法详解

    Java实现验证文件名有效性的方法详解

    在本文中,我们将讨论使用 Java 验证一个给定的字符串是否具有操作系统的有效文件名的不同方法,文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-09-09

最新评论