我有一个带有一些静态方法的类。这些静态方法使用相同的资源。(数据列表)。我希望这个数据列表是线程安全的。由于同一类中的静态方法数使用相同的数据列表。我不能简单地使用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);
}
}
答案 0 :(得分:2)
我不能简单地使用lock / Monitor来保护我在多线程环境中的代码。
是的,你可以。那是完全你想要做的事情。
如何确保只有一个线程正在执行我的类的任何方法,而其他线程应该等待此线程退出,无论他们想在我的类中运行相同的方法还是不同的方法。我怎样才能做到这一点?
使用lock
/ Monitor
。或者其他一些线程隐喻,例如线程安全集合,但lock
是最简单的。当您处理实际上是多个操作的原子单元时,线程安全集合需要更多思考(例如,如果缺少则测试然后添加)。
另一个提示是:不要使用可变数据的静态列表:这很少是一个好主意。
答案 1 :(得分:0)
您可以为 MyLibraryClass 使用 [同步] 属性。这将确保整个类是线程安全的。