当前位置: 首页 > 网络应用技术

Golang Sync.map如何避免尽可能多地使用锁?

时间:2023-03-08 18:04:57 网络应用技术

  Sync.map就像GO中的本机映射一样,但是它是多态内的线程安全性,而无需锁定或协调。负载,存储和删除Amortia的固定时间。

  地图类型针对两种常见情况进行了优化:(1)给定键的输入仅写一次,但要多次读取(例如高速缓存中的高速缓存),或(2)执行多个goroutine通过多个goroutine执行,编写和覆盖非启动密钥集的输入。在这两种情况下,使用sync.map与与单独的mutex或rwmutex配对配对的sync.map相比,可以显着降低锁定。首次使用后复制。

  读取的本地词典可以被视为快照。它将始终保存同步中包含的所有键值对。映射值满足条件时。尽管读取字典不会增加或减少其中的密钥,但它允许更改密钥的相应值。从传统意义上讲,这不是快照。它仅读取仅用于键的集合。

  以肮脏字段为代表的本机词典存储了一对键,与读取字段中的本机词典一致。它的关键类型也是接口{},它也首先转换值,然后将其称为dirty Dictionary。

  请注意,如果肮脏的词典和仅读取字典具有相同的键值对,则这里的两个键必须是相同的基本值,这对于两个值是相同的。

  如前所述,这两个词典仅在存储存储键和值而不是基本值时才会存储在其中之一中。

  当Sync.map在寻找指定键的相应值时,他总是只读在字典中以查找,并且不需要锁定相互锁定。仅当确定“仅阅读词典,但可能会有作为肮脏词典中的此键”,它将访问锁定保护上的污垢。

  相应地,当Sync.map与存储密钥值配对时,只要仅在字典中读取密钥,并且密钥值未标记为“已删除”,则新值将在内部和直接返回中存储,在这种情况下,无需锁定。否则,钥匙值在锁定的保护下存储在肮脏的词典中。这次,将删除钥匙值对的“删除”标记。

  顺便说一句,只有当键值应删除,但仍存在于读字典中时,它将被逻辑删除,并以“已删除”,而不是直接删除。

  这种情况将在重建肮脏的词典后的一段时间内出现。

  在搜索和浏览钥匙值时,始终会忽略逻辑删除的键值。对于删除键值,Sync.map将首先检查字典中是否有相应的键。如果不是,则可能存在肮脏的键。词典,然后它将尝试在锁定的保护下从肮脏的词典中删除钥匙值对。

  最后,Sync.map将将中指值的键值放在零上,这是逻辑删除的另一种方式。

  此外,您还需要注意它。只有阅读字典和肮脏的词典才会相互转换。

  当在肮脏词典中找到键值的数量时,同步映射将直接将饮食字典读为仅读字典,将其保存在其读取字段中,然后将代表肮脏词典的肮脏字段的值放在零。

  之后,一旦存储了一个新的密钥值,它将仅根据读取字典来重建肮脏的词典。这次,它将滤除仅由逻辑删除的密钥值。当然,这些转换操作,这些转换操作必须在锁的保护下执行。

  总而言之,词典中的Sync.map的键值对和肮脏的词典没有实时同步,并且在某些时间段内可能会有所不同。

  由于字典中的键集无法更改,因此钥匙值有时可能不完整。

  相反,肮脏词典中的键值始终是完整的,它将不包括已通过逻辑删除的钥匙值对。

  因此,可以看出,当有很多阅读操作但写作操作很小时,安全词典的性能通常会更好。

  在几项写作操作中,新的钥匙值对在同一安全词典的性能上的操作是最大的。

  其次是删除操作,

  最后,修改操作。

  如果仅在Sync.map中已经存在的读取字典中读取操作的键值,并且在逻辑上不会删除,则修改它不会使用锁定,并且对其性能的影响将很小。

  内容来源:

  作者:第八个社区