分布式服务器Server.Common MongoDBClient类封装MongoClient 使用双重检验锁检验初始化单例

         MongoClient是连接MongoDB数据库的中间件,在使用MongoClient类之前要从NuGet里面安装MongoDB.BsonMongoDB.DriverMongoDB.Driver.Core 三个包后才能使用完整的功能。

        

        和上一篇文章要写的东西基本上差不多。自己封装的MongoDBClient代码量很少,基本原理就是在MongoClient的基础上封装了一层,使用xml配置里的ServerConfig.MongoConnectionString去New了一个MongoClient,然后把ip地址和端口端口构造函数就可以了。

        要强调的一点是,单例实例化的过程中考虑到了多线程并发的情况,所以使用了双重检验锁这里判断两次的目的主要是:线程1和线程2同时进入外层的==null逻辑,线程2跑的比线程1块很多,线程2执行了lock(lock_obj),然后走完了初始化,完成后离开了lock块,然后解锁lock_obj对象;线程1才走到判断lock_obj有没有被锁上,这时候线程2结果了,线程1判断应该是没有锁上,会锁上lock_obj,进入lock中的代码块,如果这时候不加m_CurrClient==null,导致的结果 是会 初始化两次m_CurrClient。

        贴出来代码:

using MongoDB.Driver;
using System;
using System.Collections.Generic;
using System.Text;

namespace Servers.Common
{
    class MongoDBClient
    {
        private static object lock_obj = new object();

        /// <summary>
        /// 中间件的客户端
        /// </summary>
        private static MongoClient m_CurrClient = null;

        public static MongoClient CurrClient
        {
            get 
            {
                if (null == lock_obj)
                {
                    lock (lock_obj)
                    {
                        if (null == lock_obj)
                        {
                            m_CurrClient = new MongoClient(ServerConfig.MongoConnectionString);
                        }
                    }
                }
                
                return m_CurrClient;
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_33531923/article/details/127098010