0

我正在制作一个很酷的 (imo) T4 模板,这将使缓存更容易。我制作这个模板的一个选项是允许“加载一次”类型的功能,尽管我不确定它有多安全。

基本上,我想这样做,以便您可以执行以下操作:

var post=MyCache.PostsCache.GetOrLockLoad(id, ()=>LoadPost(id));

并且基本上做到了,当必须加载缓存时,它将在PostsCache. 这样,其他线程将阻塞,直到LoadPost()函数完成。这使得 LoadPost 只会在每次缓存未命中时执行一次。执行此操作的传统方法是 LoadPost 将在缓存为空的任何时候执行,如果在第一次加载缓存之前有多个请求,可能会执行多次。

这是一件合理的事情,还是因为这种危险或浪费的事情而阻塞其他线程?我在想线程锁定开销大于大多数操作,但也许不是?

有没有人看到过这种事情,这是一个好主意还是危险?

此外,尽管它被设计为在任何缓存和应用程序类型上运行,但它最初的目标是 ASP.Net 的内置缓存机制。

4

1 回答 1

0

这似乎没问题,因为理论上第一个请求之后的请求只会等待它们自己加载数据所花费的时间。

但它仍然感觉有点不确定 - 如果第一个加载程序线程由于一些可能不会影响其他线程的间歇性问题而被阻止怎么办。感觉让每个线程独立尝试加载会更安全。

它还增加了锁定机制的复杂性和开销。请记住,您执行的锁定越多,您引入的陷入死锁条件的风险就越大(通常)。尽管在您的情况下,只要方法中没有时髦的锁定,LoadPost它就不应该成为问题。

考虑到风险,我认为您最好选择非锁定选项。

毕竟,对于任何给定的线程,等待时间几乎相同——要么是加载时间,要么是等待第一个线程加载所花费的时间。

当使用非并发选项而不是并发选项时,我总是有点不舒服,尤其是在收益似乎微不足道的情况下。

于 2012-12-06T05:45:01.177 回答