如何使线程安全,而不是线程安全
问题描述:
我有这个代码,我不知道,如果它是线程安全或不!如何使线程安全,而不是线程安全
如果是线程安全的,如何使它并不安全,反之亦然
namespace ThreadSafeTest
{
class Program
{
static void Main(string[] args)
{
Task.Factory.StartNew(() =>
{
for (int i = 0; i < 1000; i++)
{
var user = new User() { Id = i };
method(user);
}
});
Task.Factory.StartNew(() =>
{
for (int i = 1000; i < 2000; i++)
{
var user = new User() { Id = i };
method(user);
}
});
Console.ReadLine();
}
static void method(User user)
{
Console.WriteLine([email protected]"the {user.Id} is {user.Id}{user.Id}");
}
}
public class User
{
public int Id { get; set; }
}
}
是复杂的理解这个概念 感谢
答
你的代码是线程安全的,因为没有共享状态(即不同的线程不共享同一个对象)。唯一的“共享”是拨打Console.WriteLine
,即thread-safe。
至于如何使它不是线程安全的一个例子,更改:
static void method(User user)
{
Console.WriteLine([email protected]"the {user.Id} is {user.Id}{user.Id}");
}
到:
private static List<User> list = new List<User>();
static void method(User user)
{
list.Add(user);
Console.WriteLine([email protected]"the {user.Id} is {user.Id}{user.Id}");
}
因为list.Add
是not thread-safe。
注意上面list.Add
代码可能仍然有时工作 - 但它不是保证工作(它将如果你运行它足够长的时间绝对失败)。
确定list.add不是线程安全的,但该方法仍然是线程安全的。 bcs用户标识字段从用户获取其值。我的问题是关于如何使这种方法不安全?在某些地方我用ref读取它会是不安全的,但我不确定 –
'method'在我显示的版本中**不是**线程安全的。如果'list.Add'不是线程安全的,并且'method'调用它,那么(根据定义)'method'也不是线程安全的。 – mjwills
'我读过的某个地方会不安全,但我不确定你在哪里读过这些内容? – mjwills