加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – Cargo-cult编程:锁定System.Object

发布时间:2020-12-15 04:00:34 所属栏目:百科 来源:网络整理
导读:我想我已经开发了一种货物崇拜编程习惯: 每当我需要创建一个类线程安全时,例如一个具有Dictionary或List的类(完全封装:永远不会直接访问并仅由我的类的成员方法修改),我创建了两个对象,如下所示: public static class Recorder { private static readonly
我想我已经开发了一种货物崇拜编程习惯:

每当我需要创建一个类线程安全时,例如一个具有Dictionary或List的类(完全封装:永远不会直接访问并仅由我的类的成员方法修改),我创建了两个对象,如下所示:

public static class Recorder {

    private static readonly Object _devicesLock = new Object();
    private static readonly Dictionary<String,DeviceRecordings> _devices;

    static Recorder() {

        _devices = new Dictionary<String,DeviceRecordings>();

        WaveInCapabilities[] devices = AudioManager.GetInDevices();
        foreach(WaveInCapabilities device in devices) {

            _devices.Add( device.ProductName,new DeviceRecordings( device.ProductName ) );
        }
    }//cctor

    // For now,only support a single device.

    public static DeviceRecordings GetRecordings(String deviceName) {

        lock( _devicesLock ) {

            if( !_devices.ContainsKey( deviceName ) ) {

                return null;
            }

            return _devices[ deviceName ];
        }
    }//GetRecordings
}//class

在这种情况下,我将所有操作包装在一个锁(_devicesLock){block中的_devices上.我开始怀疑这是否必要.为什么我不直接锁定字典?

解决方法

在您的用例中,锁定字典会很好,因为它是私有的.您仍然需要仔细设计您的类以防止死锁.

如果字典是唯一需要线程安全且代码的其他部分是线程安全的共享资源,我建议使用ConcurrentDictionary而不是锁定.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读