Как написать потокобезопасный список, используя модель копирования при записи в .NET?
Ниже приведена моя текущая реализация, но после большого количества чтения о многопоточности, барьерах памяти и т. д. я знаю, что мне нужно быть осторожным, когда задействована многопоточность без блокировок. Может ли кто-нибудь прокомментировать, если это правильная реализация?
class CopyOnWriteList
{
private List<string> list = new List<string>();
private object listLock = new object();
public void Add(string item)
{
lock (listLock)
{
list = new List<string>(list) { item };
}
}
public void Remove(string item)
{
lock (listLock)
{
var tmpList = new List<string>(list);
tmpList.Remove(item);
list = tmpList;
}
}
public bool Contains(string item)
{
return list.Contains(item);
}
public string Get(int index)
{
return list[index];
}
}
ИЗМЕНИТЬ
Чтобы быть более конкретным: является ли приведенный выше код потокобезопасным, или я должен добавить что-то еще? Кроме того, все потоки в конечном итоге увидят изменение в ссылке list
? Или, может быть, мне следует добавить ключевое слово volatile
в поле списка или Thread.MemoryBarrier в методе Contains между доступом к ссылке и вызовом метода на нем?
Вот, например, реализация Java, выглядит как моя приведенный выше код, но является ли такой подход потокобезопасным в .NET?
И здесь тот же вопрос, но тоже на Java.
Здесь еще один вопрос, связанный с Вот этот.