gpt4 book ai didi

.net - 将单个元素锁定在静态集合中?

转载 作者:行者123 更新时间:2023-12-03 13:16:23 25 4
gpt4 key购买 nike

我有一个静态的对象集合,该对象将经常从多个线程中更新。是否可以将单个对象锁定在一个集合中,而不是锁定整个集合,以便只有试图访问该集合中相同对象的线程才会被阻塞,而不是每个线程都被阻塞?

如果有更好的方法可以从多个线程更新集合中的对象,我将不知所措。

最佳答案

首先,在ASP.NET应用程序中,最好使用HttpCache对象,而不是简单的静态集合。

关于您的实际问题,您确实可以为集合中的每个项目维护一个锁(每个对象在.NET中都有一个监视器,因此它们相对便宜)。但是,您可能想与实际集合一起使用来做到这一点:

为了简单起见,我将在此处使用static,但是如上所述,HttpCache可能更好:

class CacheItem
{
private readonly object _lock = new object();

public void DoSomething()
{
lock(_lock)
{
// perform some synchronized action on the individual item
}
}
}

// I'd recommend a reader-writer lock for the
// collection so that you can have multiple retrievals
// of items and still lock exclusively for changing the collection
private static ReaderWriterLockSlim itemsLock = new ReaderWriterLockSlim();
private static List<CacheItem> items = new List<CacheItem>();

public static void AddItem(CacheItem item)
{
itemsLock.EnterWriteLock();

try
{
items.Add(item);
}
finally
{
itemsLock.ExitWriteLock();
}
}

pulbic static CacheItem GetItem(int index)
{
itemsLock.EnterReadLock();

try
{
return items[index];
}
finally
{
itemsLock.ExitReadLock();
}
}

关于.net - 将单个元素锁定在静态集合中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5148730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com