与缓存交互时的线程安全性

时间:2012-02-19 19:41:50

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

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

例如,从asp.net缓存中读取和写入。

我正在开发一个高规模的.net应用程序,与缓存交互。

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

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

2 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:0)

本质上,乐观锁定方案基于以下思想:在正常操作中,写入相同数据将不会并发。因此,他们有某种版本控制机制,因此可以检测到潜在的碰撞并且它们会引发错误。在Crud应用程序中,通常“其他人已经更改了此数据,请再试一次”,并希望返回当前数据,以便完成此操作。

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

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