欢迎来到代码驿站!

JAVA代码

当前位置:首页 > 软件编程 > JAVA代码

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

时间:2022-12-15 10:31:58|栏目: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();

总结

上一篇:java实现简单银行ATM系统

栏    目:JAVA代码

下一篇:java实现打砖块游戏算法

本文标题:Java单例模式的线程安全,饿汉和懒汉模式详解

本文地址:http://www.codeinn.net/misctech/221416.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有