首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程是否在同步时钟上阻塞?

线程是否在同步时钟上阻塞?
EN

Stack Overflow用户
提问于 2015-03-27 00:52:46
回答 1查看 804关注 0票数 1

我在一个名为Silverlight的vb.net模块中获得了以下代码。它基本上在每个线程的基础上分配唯一的It。

代码语言:javascript
复制
Public Module IdManager

Private _threadTrackingIds As New Dictionary(Of Integer, String)
Private _lockObject As New Object

Public Function GetNext() As String
    Dim threadId = System.Threading.Thread.CurrentThread.ManagedThreadId
    Dim g As String = Guid.NewGuid().ToString()
    SyncLock _lockObject
        _threadTrackingIds(threadId) = g
    End SyncLock
    Return g
End Function

Public ReadOnly Property CurrentTrackingID As String
    Get
        Dim threadId = System.Threading.Thread.CurrentThread.ManagedThreadId
        Dim idToReturn As String = String.Empty
        SyncLock _lockObject
            If (_threadTrackingIds.ContainsKey(threadId)) Then
                idToReturn = _threadTrackingIds(threadId)
            End If
        End SyncLock
        Return idToReturn
    End Get
End Property

End Module

GetNext()返回一个字符串,但在大多数情况下,我只是调用它而不检查返回值(也就是说,只调用IdManager.GetNext()而不将其赋值给变量),因为我需要时才需要这个值(有时是其他方法),所以我只需在需要时调用CurrentTrackingId。

但是,我有多个线程调用这个(因此是同步时钟),所以我的问题是:如果IdManager.GetNext()调用没有得到锁,那么它的调用代码会阻塞,还是会一直持续到需要阻塞为止?也就是说,我想知道如果不将字符串值赋值给变量(即z= IdManager.GetNext()),然后可能使用该变量,将使调用方忽略它没有获得锁的事实。如果它没有阻塞,那么线程会继续执行剩下的指令而不可能设置CurrentTrackingID吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-27 01:14:56

是的,SyncLock通过只允许一个线程输入受保护的代码来提供同步。在完全相同的时间尝试进入的任何其他线程都将被阻塞,直到锁被释放。

这种情况发生的可能性很低。但不是零。你保持锁的时间很短,字典是相当有效的,只需一微秒一小部分。您必须以每秒数十万次调用这些方法才能注意到任何争用。

没什么好担心的。如果绝对有必要的话,您可以回到ConcurrentDictionary,它使用更细粒度的锁,而且更友好,因为您不必显式使用SyncLock。

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

https://stackoverflow.com/questions/29291518

复制
相关文章

相似问题

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