csharp中的类级别锁定

时间:2013-12-16 10:50:30

标签: c# .net multithreading

我有一个带有一些静态方法的类。这些静态方法使用相同的资源。(数据列表)。我希望这个数据列表是线程安全的。由于同一类中的静态方法数使用相同的数据列表。我不能简单地使用lock / Monitor来保护我在多线程环境中的代码。我怎样才能确保只有一个线程正在执行我的类的任何方法,而其他线程应该等待这个线程退出,无论他们想在我的类中运行相同的方法还是不同的方法。我怎样才能做到这一点? 这里有一些代码需要澄清。我的工作是编写MyLibraryClass

class Program
{
    static void Main(string[] args)
    {

        var t1 =System.Threading.Tasks.Task.Factory.StartNew(MyLibraryClass.A);

        var t2 = System.Threading.Tasks.Task.Factory.StartNew(MyLibraryClass.B);

        t1.Wait();
        t2.Wait();
        Console.WriteLine("Completed. Press any key to continue");
        Console.ReadKey();
    }

}

class MyLibraryClass
{

    static List<int> items = new List<int>();
    static MyLibraryClass()
    {
        items.Add(5);
        items.Add(4);
    }
    public static void A()
    {
        foreach (var a in items)
        {
            Console.WriteLine(a);
            System.Threading.Thread.Sleep(300);
        }
    }

    public static void B()
    {
        System.Threading.Thread.Sleep(200);
        Console.WriteLine("Adding Number");
        items.Add(9);
    }
}

2 个答案:

答案 0 :(得分:2)

  

我不能简单地使用lock / Monitor来保护我在多线程环境中的代码。

是的,你可以。那是完全你想要做的事情。

  

如何确保只有一个线程正在执行我的类的任何方法,而其他线程应该等待此线程退出,无论他们想在我的类中运行相同的方法还是不同的方法。我怎样才能做到这一点?

使用lock / Monitor。或者其他一些线程隐喻,例如线程安全集合,但lock是最简单的。当您处理实际上是多个操作的原子单元时,线程安全集合需要更多思考(例如,如果缺少则测试然后添加)。

另一个提示是:不要使用可变数据的静态列表:这很少是一个好主意。

答案 1 :(得分:0)

您可以为 MyLibraryClass 使用 [同步] 属性。这将确保整个类是线程安全的。