用于创建对象的互斥锁

时间:2014-04-19 15:00:48

标签: c# multithreading thread-safety mutex

我正在创建这样的对象:

       if (_cleaner == null)
        {
            _creation.WaitOne();
            try
            {
                if (_cleaner == null)
                {
                   //create object
                }
            }
            finally
            {
                _creation.ReleaseMutex();
            }
        }

我进行仔细检查的原因是因为两个线程可以同时创建对象,然后我显然只需要一个来创建一个对象。有没有更好的方法呢? 所以我不必检查对象存在两次?

2 个答案:

答案 0 :(得分:3)

您可能希望使用Lazy<T>,语法更清晰,更少error-prone than double check locking

它可以帮助你创建一个只在初次访问时初始化一次的对象(lazy initialization),我认为语法是不言自明的,一些用法示例在this MSDN article,我&# 39;举个例子:

class Customer
{
    private Lazy<Orders> _orders;
    public string CustomerID {get; private set;}
    public Customer(string id)
    {
        CustomerID = id;
        _orders = new Lazy<Orders>(() =>
        {
            // You can specify any additonal  
            // initialization steps here. 
            return new Orders(this.CustomerID);
        });
    }

    public Orders MyOrders
    {
        get
        {
            // Orders is created on first access here. 
            return _orders.Value;
        }
    }
}

答案 1 :(得分:0)

也许使用一个有生命周期管理器的框架(例如Unity)来帮助管理你的对象? 顺便说一句,Unity做得更多。

Unity - Lifetime manager