【发布时间】:2013-12-16 10:50:29
【问题描述】:
我有一个带有一些静态方法的类。这些静态方法使用相同的资源(数据列表)。我希望这个数据列表是线程安全的。由于同一类中的静态方法数量正在使用相同的数据列表。我不能简单地使用 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);
}
}
【问题讨论】:
-
How can I ensure that only one thread is executing any method of my class...- 不使用多线程 -
在所有那些在所有情况下都适用于同一个
private static readonly object _lock = new object();的方法中放置一个锁块......? :) 尽管对此类使用多线程毫无意义,因为您将强制顺序执行。 -
@DGibbs 先生的声明相当轻率。 OP 可能正在编写供其他工程师使用的代码。代码甚至可能是产品。如果并发会导致问题,它肯定会希望确保调用序列化。
-
@PatrykĆwiek 共享资源是唯一正在发生的事情是非常罕见的,所以它不是“毫无意义”
-
@MarcGravell 确实如此,但多线程环境中的静态、可变数据让我什至想都不敢想。
标签: c# .net multithreading