我有一个问题,我认为可能是与线程安全相关的问题。我创建了一个“简化”版本的代码,试着看看我是否可以解决任何线程安全问题。
无论我多久运行一次,我都没有遇到线程安全问题。我可以假设这个“测试”代码是线程安全的吗?
class Program
{
static void Main()
{
Random random = new Random();
for (int i = 0; i < 10; i++)
{
new Thread(new AsmxService().Go).Start(random.Next(1, 10));
}
Console.Read();
}
}
public class AsmxService
{
public void Go(object obj)
{
StaticImport.Import((int)obj);
}
}
public class StaticImport
{
public static List<Lookup> lookups = new List<Lookup>()
{
new Lookup(1, "No. 1"),
new Lookup(2, "No. 2"),
new Lookup(3, "No. 3"),
new Lookup(4, "No. 4"),
new Lookup(5, "No. 5"),
new Lookup(6, "No. 6"),
new Lookup(7, "No. 7"),
new Lookup(8, "No. 8"),
new Lookup(9, "No. 9"),
new Lookup(10, "No. 10")
};
public static void Import(int id)
{
Lookup lu = lookups.First(l => l.Id == id);
Console.WriteLine("Go lookup, Id: {0} & Name: {1}", lu.Id, lu.Name);
// Import here
if (lu.Id != id)
{
throw new Exception(string.Format("Thread Safety issue! Id passed in: {0}, Id on instance: {1}***", id, lu.Id));
}
else
{
Console.WriteLine("Successful!");
}
}
}
public class Lookup
{
public Lookup(int id, string name)
{
this.Id = id;
this.Name = name;
}
public int Id { get; set; }
public string Name { get; set; }
}
为了确保我的测试代码正确代表我的实际代码,这是逻辑流程:
我的问题是,在最后一步(7),由于线程安全问题,查找值(步骤5)是否有可能发生变化?
提前谢谢。
答案 0 :(得分:1)
这看起来ThreadSafe
但是如果写入List
则不是,在这种情况下;事实并非如此。
例如,如果从数据库填充集合,并且某些其他程序写入数据库,则会发生冲突。
如果它只是只读的,那么你的确很好。但是,查看lock
语句(http://msdn.microsoft.com/en-us/library/vstudio/c5kehkcz.aspx)
并阅读一些关于乐观和悲观数据库锁定的内容。 (Optimistic vs. Pessimistic locking)