Rozważmy następujący przykład:C# równoległy dostęp do odczytu do listy bez kopiowania
class Example
{
private readonly List<string> _list = new List<string>();
private readonly object _lock = new object();
public IReadOnlyList<string> Contents
{
get
{
lock (_lock)
{
return new List<string>(_list);
}
}
}
public void ModifyOperation(string example)
{
lock (_lock)
{
// ...
_list.Add(example);
// ...
}
}
}
Jak można przeczytać równoległy dostęp do listy Contents
zostać osiągnięty bez kopiowania całej listy? W języku C# są współbieżne Collections
, ale nie ma listy bezpiecznych wątków. W Javie jest coś takiego jak CopyOnWriteArrayList
.
Jak o [ 'ImmutableList'] (https://msdn.microsoft.com/ en-us/library/dn467185 (v = vs.111) .aspx) z pakietu 'System.Collections.Immutable' –
Co z blokowaniem kolekcji? (https://msdn.microsoft.com/en-us/library/dd267312(v=vs.110).aspx) – derape
Dopóki zezwolisz na wywołanie 'ModifyOperation()', podczas gdy inny kod (prawdopodobnie inny wątek) ma dostęp do obiektu zwróconego z 'Contents', to nie będzie bezpieczny dla wątków, jeśli zwrócisz bazową' Listę 'bez tworzenia kopii (tak jak już to robisz) –