线程安全的单实例模式

wuyepeng wuyepeng     2022-12-29     690

关键词:

我们都很清楚一个简单的单例模式该怎样去实现:构造函数声明为private或protect防止被外部函数实例化,内部保存一个private static的类指针保存唯一的实例,实例的动作由一个public的类方法代劳,该方法也返回单例类唯一的实例。单例大约有两种实现方法:懒汉与饿汉。
懒汉:故名思义,不到万不得已就不会去实例化类,也就是说在第一次用到类实例的时候才会去实例化,节省内存。
饿汉:饿了肯定要饥不择食。所以在单例类定义的时候就进行实例化。浪费内存
特点与选择:
由于要进行线程同步,所以在访问量比较大,或者可能访问的线程比较多时,采用饿汉实现,可以实现更好的性能。这是以空间换时间。
在访问量较小时,采用懒汉实现。这是以时间换空间。

首先是饿汉模式:

饿汉,线程安全,不会内存泄漏
class singleton

private:
static singleton*p;  
singleton() 
~CSingleton()
  
   if (p== NULL)  return ;
   delete P;
   P = NULL;
   
public:
    static singleton* initance();
    singleton* p = new singleton();//饿汉的体现,直接实例化,也就不存在线程不安全了。
    singleton* initance()
    
      return p;
    
;

  懒汉模式:

方法一:使用加锁来达到线程安全

class singleton

protected:
  singleton()
  
    pthread_mutex_init(&mutex);
  
private:
  static singleton* p;
public:
  static pthread_mutex_t mutex;
  static singleton* initance();
;
 
pthread_mutex_t singleton::mutex;
singleton* singleton::p = NULL;
singleton* singleton::initance()

  if (p == NULL)
  
    pthread_mutex_lock(&mutex);
    if (p == NULL)
      p = new singleton();
    pthread_mutex_unlock(&mutex);
  
  return p;

  方法二:使用内部静态变量来达到线程安全

class singleton

protected:
  singleton()
  
    pthread_mutex_init(&mutex);
  
public:
  static pthread_mutex_t mutex;
  static singleton* initance();
  int a;
;
 
pthread_mutex_t singleton::mutex;
singleton* singleton::initance()

  pthread_mutex_lock(&mutex);
  static singleton obj;
  pthread_mutex_unlock(&mutex);
  return &obj;

  






c++的单例模式与线程安全单例模式(懒汉/饿汉)

1教科书里的单例模式  我们都很清楚一个简单的单例模式该怎样去实现:构造函数声明为private或protect防止被外部函数实例化,内部保存一个privatestatic的类指针保存唯一的实例,实例的动作由一个public的类方法代劳,该方法... 查看详情

线程安全的单例模式

1.全局变量的缺点:必须在程序一开始就创建好对象,如果程序在这次的执行过程中又一直没用到它,就非常耗费资源。 2. 经典的单例模式实现:Java代码publicclassSingleton{//用一个静态变量来记录Singleton类的唯一实例privates... 查看详情

多线程实现单例模式(饿汉懒汉)实现线程安全的单例模式(双重效验锁)(代码片段)

...比饿汉模式好。主要因为懒汉模式的效率更高1.饿汉模式(线程安全)//饿汉模 查看详情

线程安全的单例模式(代码片段)

... 双重检查锁与延迟初始化(懒汉式)    在Java多线程程序中,有时候需要采用延迟初始化来降低初始化类和创建对象的开销,在使用这些对象时才进行初始化。延迟初始化需要注意线程安全  问题,否则就容易出现问... 查看详情

线程安全的单例模式的几种实现

单例模式是一种常见的设计模式;JavaSingleton模式就为我们提供了这样实现的可能。使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收(garbagecollection)。 单例模式也是一种比较常见的设... 查看详情

线程安全的单例模式(代码片段)

饿汉模式1publicclassSingle23privatestaticSingleinstance=newSingle();45privateSingle()6System.out.println("Single:"+System.nanoTime());789publicstaticSinglegetInstance()10returninstance;1112  查看详情

实现线程安全的单例模式

一、双检查锁机制packagesingleton;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;/***双检查锁机制--单例模式*Createdbydaizengjieon2017/8/29.*/publicclassMySingleton{privatestaticfinalLoggerlogger=LoggerFactory.getL 查看详情

多线程阻塞队列定时器线程安全的单例模式的原理及实现(代码片段)

文章目录1.线程安全版本的单例模式1.1单例模式介绍1.2实现线程安全版本的懒汉模式2.阻塞队列2.1阻塞队列介绍2.2标准库中的阻塞队列2.3实现阻塞队列2.4生产者消费者模型3.定时器3.1定时器介绍3.2标准库中的定时器3.3实现定时器1.... 查看详情

多线程阻塞队列定时器线程安全的单例模式的原理及实现(代码片段)

文章目录1.线程安全版本的单例模式1.1单例模式介绍1.2实现线程安全版本的懒汉模式2.阻塞队列2.1阻塞队列介绍2.2标准库中的阻塞队列2.3实现阻塞队列2.4生产者消费者模型3.定时器3.1定时器介绍3.2标准库中的定时器3.3实现定时器1.... 查看详情

线程安全的单例模式(代码片段)

一饿汉模式packagecom.thread;publicclassTest8publicstaticvoidmain(String[]args)MyThreadt1=newMyThread();MyThreadt2=newMyThread();MyThreadt3=newMyThread();t1.start();t2.start();t3.start();classMyObjectp 查看详情

java基础——线程安全的单例模式懒汉式

packagesavesingleton;/*使用同步将单例模式中的懒汉式改写成线程安全的@authorzsben@create2020-01-0322:22*/classBank{privateBank(){}privatestaticBankinstance=null;/*publicstaticsynchronizedBankgetInstance(){if(instance==null){ 查看详情

高并发下线程安全的单例模式

...现方式,你是否都了解呢?高并发下如何保证单例模式的线程安全性呢?如何保证序列化后的单例对象在反序列化后任然是单例的呢?这些问题在看了本文之后都会一一的告诉你答案,赶快来阅读吧!什么是单例模式?在文 查看详情

如何写一个简单的单例模式?

...持的引用。二、示范如下:1、枚举实现单例:2、懒汉式线程不安全:3、懒汉式线程安全:4、饿汉式:5、双重校验锁:6、静态内部类:扩展资料:一、单列模式简介:单例模式是设计模式中最简单的形式之一。这一模式的目的... 查看详情

多线程下的单例模式

...现方式,你是否都了解呢?高并发下如何保证单例模式的线程安全性呢?如何保证序列化后的单例对象在反序列化后任然是单例的呢?这些问题在看了本文之后都会一一的告诉你答案,赶快来阅读吧!什么是单例模式?在文章开... 查看详情

设计模式之单例模式

C++的单例模式与线程安全的单例模式(懒汉/饿汉)1教科书里的单例模式  我们都很清楚一个简单的单例模式该怎样去实现:构造函数声明为private或protect防止被外部函数实例化,内部保存一个privatestatic的类指针保存唯一的实例... 查看详情

dcl双检查锁机制实现的线程安全的单例模式

publicclassMyObject{privatevolatilestaticMyObjectmyObject;privateMyObject(){}publicstaticMyObjectgetInstance(){try{if(myObject!=null){}else{Thread.sleep(3000);synchronized(MyObject.class){if(myObject= 查看详情

单例模式的线程安全性

...式”是在你真正用到的时候才去建这个单例对象,所以是线程不安全的懒汉式如果在创建实例对象时 查看详情

5java单例模式(线程安全性)(代码片段)

...eton();returninstance;需要实例的时候创建,此方式没考虑线程安全性问题,在多个线程并发调用newInstance()方法,可能会导致创建多个实例 查看详情