C#中锁与日志使用问题:ReSharper警告是否可忽略?
关于ReSharper警告与log4net线程安全的问题
ReSharper警告可直接忽略
log4net的ILogger实例本身就是线程安全的,官方设计时就充分考虑了多线程调用场景,不管是在lock代码块内还是外部调用,都不会引发线程安全问题。ReSharper触发这个警告,只是因为它检测到Logger同时存在锁内和锁外的调用,误判该成员需要强制同步,这属于工具的误报,完全可以忽略。锁定逻辑的理解纠正
你说“锁定的是方法而非对象”是错误的——lock(_padlock)语句锁定的是_padlock这个对象,而非整个方法。MethodWithLock里的锁是用来保护代码块内的业务逻辑,和Logger本身的线程安全没有关联。无需创建两个ILogger实例
你代码中声明的static readonly类型Logger,作为静态实例可以被多线程安全共享,完全没必要为锁内、锁外的调用分别创建实例。log4net的Logger实例是全局复用的,重复创建反而属于冗余操作。
你的示例代码
private class Test{ private static readonly ILogger Logger = LoggerFactory.GetLogger(typeof(Test)); void MethodWithLock() { lock(_padlock) { //some logic here Logger.Debug("dummy log"); //some logic here } } void MethodWithoutLock() { //some logic here Logger.Debug("dummy log"); } }
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

