首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >共享接口和ReaderWriterLockSlim

共享接口和ReaderWriterLockSlim
EN

Stack Overflow用户
提问于 2009-08-27 20:33:29
回答 2查看 454关注 0票数 0

我在一个有多个线程的类中使用log4net,我有一个简单的问题。在log4net.ILog接口上检查属性和调用方法时,是否需要输入readlock/writelock?

我使用的是log4net示例中建议的方法,所以在上述类的顶部,我有:

代码语言:javascript
复制
Private Shared ReadOnly log As log4net.ILog = log4net.LogManager.GetLogger(decType) 

由于该类涉及多个线程与其交互,因此我有一个ReaderWriterLockSlim实例,我使用它来确保我的变量不会遇到任何争用条件。总而言之,如果我想确保我在练习安全的线程,我需要这样做:

代码语言:javascript
复制
If Me.ReaderWriterLockSlim.TryEnterUpgradableReadLock(-1) Then
  If log.IsWarnEnabled Then
    If Me.ReaderWriterLockSlim.TryEnterWriteLock(-1) Then
      log.Warn("Log Message Here")
      Me.ReaderWriterLockSlim.ExitWriteLock()
    End If
  End If
  Me.ReaderWriterLockSlim.ExitUpgradeableReadLock()
End If

或者,我可以简单地这样做:

代码语言:javascript
复制
If log.IsWarnEnabled Then log.Warn("Log Message Here")

附注:是的,这是一个粗糙的伪代码,实际上我没有一个名为'ReaderWriterLockSlim‘的ReaderWriterLockSlim实例。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-08-27 20:41:21

所以你基本上想知道log4net是否是线程安全的?

FAQ

是的,log4net是线程安全的。

所以你可以简单地这样做:

代码语言:javascript
复制
If log.IsWarnEnabled Then log.Warn("Log Message Here")
票数 3
EN

Stack Overflow用户

发布于 2009-09-11 09:54:16

在上面的示例中,您不需要输入写锁,因为您没有更改IsWarnEnabled的值。此外,调用具有无限超时的TryEnterWriteLock也没有任何意义--您也可以调用ReaderWriterLockSlim.EnterWriteLock。因此,即使Log4Net不是线程安全的(正如其他人所提到的,它是线程安全的),您也只需要编写:

代码语言:javascript
复制
readerWriterLock.EnterReadLock();
try
{
  if(log.IsWarnEnabled)
    log.Warn("log message here");
}
finally
{
  readerWriterLock.ExitReadLock();
}

然后,您可以在更改log.IsWarnEnabled的值时输入写锁定。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1343602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档