【问题标题】:thread safety when interacting with cache与缓存交互时的线程安全
【发布时间】:2012-02-19 19:41:49
【问题描述】:

我有一个问题可以帮助我理解 .net c# 应用程序中的线程安全和并发性。

以从 asp.net 缓存中读取和写入为例。

我正在开发一个与缓存交互的大型 .net 应用程序。

我知道不同级别的并发,乐观和悲观。但是我有点困惑这和线程安全之间的区别。

当与缓存交互时,我是否应该使用锁来确保缓存在被读取和写入时不会被多个线程操作。那么我应该使用锁吗?以及这如何适应并发性?

【问题讨论】:

  • 你同时问了很多问题。
  • 我只看到 1 个主要问题:“我应该使用锁……”。剩下的就是介绍了。

标签: c# .net multithreading concurrency thread-safety


【解决方案1】:

乐观和悲观并发是用于处理多个用户的更新并防止用户覆盖彼此的更改的概念。它们用于线程安全之外的另一个级别。线程安全锁定与悲观并发最相似。

ASP.NET 缓存对象本身是线程安全的。您可以从多个线程访问它,而不会损坏集合本身。但是,您有责任确保您放入缓存中的对象的线程安全。

最简单的方法可能是使所有要放入缓存的对象不可变(例如 .NET 的 string 类)。一旦创建,该对象将永远不会被更新并且只能从中读取。只读操作始终是线程安全的。如果您需要更新数据,您可以在旧对象的基础上创建一个新对象并替换缓存中的对象。这样您就不必自己处理线程安全问题,因为您可以依赖缓存对象。

如果你必须更新缓存中的对象,你必须确保这些对象的所有更新操作都是线程安全的。

【讨论】:

  • @Waht 是否有 2000 个线程想要从缓存中读取?一个人开始阅读。其他 1999 会等吗?
【解决方案2】:

本质上,乐观锁定方案是基于这样一种思想,即在正常操作中写入相同的数据不会是并发的。所以他们有某种版本控制机制,因此可以检测到潜在的冲突并抛出错误。在 Crud 应用程序中,通常是“其他人更改了此数据,请重试”,并希望返回当前数据,以便可以做到这一点。

悲观锁定方案假设在正常操作中大量写入将是并发的,因此会获取锁定并且在当前写入完成之前不会发生并发更新。在类似于“用户 Fred 已锁定客户账单”的 CRUD 应用中,请稍后再试。

您选择实现的任何锁定机制都应该是线程安全的,要么不能发生并发写入,要么会导致数据冲突的并发写入失败。

【讨论】:

    猜你喜欢
    • 2016-04-23
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多