6

我想我已经养成了一种货物崇拜的编程习惯:

每当我需要使类线程安全时,例如具有 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

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

4

2 回答 2

10

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

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

于 2012-10-03T07:04:53.070 回答
2

如果您确定主对象在类中完全使用,则不需要它。严格来说,即使它是没有必要的,但是具有 2 个变量的版本更容易推理:

  • 阅读代码的人不需要考虑主要对象是否曾经被暴露并可能被您的班级过分的东西锁定
  • 带有单独锁定对象的代码看起来更符合良好实践
  • 如果一个人意外/故意暴露主要对象会更安全
于 2012-10-03T07:05:45.880 回答