Skip to main content
 首页 » 编程设计

c#之锁语句饱和

2024年01月28日30unruledboy

我有这个代码:

class Program 
{ 
    static void Main(string[] args) 
    { 
        TestClass instanceOfClass = new TestClass(); 
        while (true) 
        { 
            Thread threadTest = new Thread(new ParameterizedThreadStart(AddNewToClass)); 
            threadTest.Start(instanceOfClass); 
        } 
    } 
    static void AddNewToClass(object parameter) 
    { 
        var instance = (TestClass)parameter; 
        while (true) 
        { 
            if (instance.Contains(1)) 
            { 
                continue; 
            } 
            else 
            { 
                instance.AddNew(1); 
            } 
        } 
    } 
} 
 
class TestClass 
{ 
    public Dictionary<int, string> dictionary; 
    public TestClass() 
    { 
        dictionary = new Dictionary<int, string>(); 
    } 
    public void AddNew(int test) 
    { 
        lock (dictionary) 
        { 
            dictionary.Add(test, "Test string"); 
        } 
    } 
    public bool Contains(int test) 
    { 
        lock (dictionary) 
        { 
            if (dictionary.ContainsKey(test)) 
            { 
                return true; 
            } 
            else 
            { 
                return false; 
            } 
        } 
    } 
} 

我想做的是有几个不同的线程,从字典中添加/删除对象。我尝试运行它,但出现此异常:

An item with the same key has already been added.

这看起来非常奇怪。据我所知,lock 语句应该阻止有问题的字典,并且 TestClass.Contains(1) 应该总是返回 true,并且它抛出一个异常,因为它返回 true 不止一次(因此异常).

有人知道为什么会这样吗?谢谢

请您参考如下方法:

您的Contains() 方法是原子的。您的 Add() 方法也是如此。但是,AddNewToClass() 不是。一个线程可能会从 Contains() 得到一个结果...但无法保证它何时可能会或可能不会暂停(或恢复)。

那是你的比赛条件。