lock
이 당신을 위해 오인했을 수도 있습니다. 은이 아니므로 다른 코드가 잠금을 설정 한 객체를 조작하지 못하도록합니다. 그것은 하나의 스레드가 하나의 객체에서 long을 획득하는 것을 막고, 다른 스레드는 잠금을 유지합니다.
다른 스레드가 반복하는 동안 한 스레드가 컬렉션을 조작하지 못하도록하려면 반복 코드와 조작 코드를 동일한 오브젝트에 대해 잠금 lock
블록 내에 넣어야합니다.
간단한 예제 : (이 경우 생성자 제외) 목록에 대한 모든 액세스가 모두 동일한 개체를 잠그는 lock
블록으로 포장하는 방법
class LockDemo
{
private IList<string> _items;
private object _lock = new object();
public LockDemo()
{
_items = new List<string>(new[] { "one", "two", "three" });
}
public void RemoveItem(string item)
{
lock (_lock)
{
_items.Remove(item);
}
}
public void DoSomethingThatIteratesOverTheList()
{
lock (_lock)
{
foreach (var item in _items)
{
// do something with item
}
}
}
}
알 수 있습니다. 또한이 객체는 목록 자체가 아니라 잠금 목적으로 만 사용되는 객체입니다. 이것은 lock
이 객체를 잠그지 않았 음을 보여 주지만, 다른 스레드에 의해 병렬로 실행될 수도 있고 실행되지 않을 수도있는 코드 부분을 제어하는 메커니즘을 제공합니다.
allThreads를 수정하는 코드는 어디에 있습니까? 그것은 또한 컬렉션을 잠그고 있습니까? –