关键词:
我们都很清楚一个简单的单例模式该怎样去实现:构造函数声明为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()方法,可能会导致创建多个实例 查看详情