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();