Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 静态关键字是如何影响线程安全的?为什么?_C#_.net_Multithreading_C# 4.0_Task Parallel Library - Fatal编程技术网

C# 静态关键字是如何影响线程安全的?为什么?

C# 静态关键字是如何影响线程安全的?为什么?,c#,.net,multithreading,c#-4.0,task-parallel-library,C#,.net,Multithreading,C# 4.0,Task Parallel Library,举以下例子: List<MyObject> objects = new List<MyObject(); 或 或 假设应用程序只有其中一个示例,并且同时调用了多次任务 您可以将其视为一个控制台应用程序,List objects在Main()中实例化,任务也是如此,在Main()中同时调用多次。它取决于方法的内部逻辑。目前(对于空实现),它们都是线程安全的 UPD: 现在它们都不是线程安全的。我想指出的是,static关键字本身并没有提供任何“魔力”。您可能会感到困惑,因为.N

举以下例子:

List<MyObject> objects = new List<MyObject();

假设应用程序只有其中一个示例,并且同时调用了多次
任务


您可以将其视为一个控制台应用程序,
List objects
Main()
中实例化,任务也是如此,在
Main()
中同时调用多次。

它取决于方法的内部逻辑。目前(对于空实现),它们都是线程安全的

UPD:

现在它们都不是线程安全的。我想指出的是,
static
关键字本身并没有提供任何“魔力”。您可能会感到困惑,因为.NET基类库中有一种常见的约定,即所有静态成员都是线程安全的,而所有实例成员都不是线程安全的。虽然这是事实,但这是BCL开发人员决定遵循的唯一惯例。在您自己的代码中,
静态
在您自己实现之前不会提供任何线程安全性。

例如#1要工作,您必须

static class MyClass1
{
    static List<MyObject> objects = new List<MyObject();
    static void MyMember() { objects.Add(new MyObject); }
}
静态类MyClass1
{

静态列表对象=新列表不太清楚你在问什么。请查看我会尽力澄清further@T.S.在任何程序中,几乎没有任何东西是线程安全的,除非您尽最大努力使其安全,而大多数人不会这样做,因为他们没有任何理由这样做(因为他们没有从多个线程调用该代码).@T.S.从列表中读取不是线程安全的。如果列表在迭代过程中发生更改,则会发生错误。大多数应用程序在单个线程上运行,因此缺少线程代码。即使异步调用也不能保证多线程。@AlexPaven非常清楚OP要求我做什么,要求我们做他们的功课。谢谢,我添加了一些实现致
MyMember
。非常感谢,回答了我一大堆问题!
class MyClass2
{
    void MyMember(List<MyObject> objects) { objects.Add(new MyObject); }
}
static MyClass3 myClass3 = new MyClass3();
class MyClass3
{
    void MyMember(List<MyObject> objects) { objects.Add(new MyObject); }
}
 Task.Factory.StartNew(() =>
 {
    MyClass1.MyMember(objects);
 });
 MyClass2 myClass2 = new MyClass2();
 Task.Factory.StartNew(() =>
 {
    myClass2.MyMember(objects);
 });
 static MyClass3 myClass3 = new MyClass3();
 Task.Factory.StartNew(() =>
 {
    myClass3.MyMember(objects);
 });
static class MyClass1
{
    static List<MyObject> objects = new List<MyObject();
    static void MyMember() { objects.Add(new MyObject); }
}