SyncLock是否需要重新启用?

时间:2012-09-21 16:30:39

标签: .net vb.net multithreading synclock

我在一个自动刷新某个对象的类中有以下代码,也允许您手动刷新。我想让它成为线程安全的。

Public Function ForceRefresh() As Foo
  DoRefresh()
  ResetTimer()
  Return Me.CurrentFoo
End Function

Private Sub DoRefresh()
  Me._currentFoo = Me._retriever.GetTheFoo()
End Sub

我很想Synclock这两种方法:

  • ForceRefresh:所以我们没有让多个消费者线程试图强制刷新并同时重置计时器
  • DoRefresh:如果我们已经在尝试检索一个,我们就不会尝试GetTheFoo()。我正在使用System.Threading.Timer,它可能会回调任何ThreadPool个线程,所以只使用一个标志可能不合适(但可能仍然需要?)

...像这样:

Private _syncRoot As New Object

Public Function ForceRefresh() As Foo
  Synclock _syncRoot
    'Snip ...
  End Synclock
End Function

Private Sub DoRefresh()
  Synclock _syncRoot
    'Snip ...
  End Synclock
End Sub

但是,当我致电Synclock时,我最终会在_syncRoot ForceRefresh上尝试Synclock ...现在,如果{{1}}是可重入的,那么嵌套这些将不会成为问题。 MSDN文档页面似乎暗示了这种情况,但没有明确说明。

注意:我会自己尝试一下,但我在StackOverflow上没有看到任何关于此的内容,并认为这是一个有用的问题可以回答。

1 个答案:

答案 0 :(得分:4)

SyncLock语句使用底层的Monitor.Enter()。 MSDN库说:

  

同一个线程在没有阻止

的情况下多次调用Enter是合法的

这意味着它是可重入的。很容易检查顺便说一句。