2017-08-19 24 views
1

我有这个代码,我不知道,如果它是线程安全或不!如何使线程安全,而不是线程安全

如果是线程安全的,如何使它并不安全,反之亦然

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; } 
} 
} 

是复杂的理解这个概念 感谢

回答

2

你的代码是线程安全的,因为没有共享状态(即不同的线程不共享同一个对象)。唯一的“共享”是拨打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.Addnot thread-safe

注意上面list.Add代码可能仍然有时工作 - 但它不是保证工作(它将如果你运行它足够长的时间绝对失败)。

+0

确定list.add不是线程安全的,但该方法仍然是线程安全的。 bcs用户标识字段从用户获取其值。我的问题是关于如何使这种方法不安全?在某些地方我用ref读取它会是不安全的,但我不确定 –

+0

'method'在我显示的版本中**不是**线程安全的。如果'list.Add'不是线程安全的,并且'method'调用它,那么(根据定义)'method'也不是线程安全的。 – mjwills

+0

'我读过的某个地方会不安全,但我不确定你在哪里读过这些内容? – mjwills