2017-08-19 26 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