我想我已经开发了一种货物崇拜编程习惯:
每当我需要创建一个类线程安全时,例如一个具有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而不是锁定.