2010-05-10 68 views
2

我使用2個線程作爲產品/使用者使用雙隊列(http://www.codeproject.com/KB/threads/DoubleQueue.aspx)。有時候在我的第二個線程中,我得到一個NULL對象,但不應該像我在第一個線程中填充它。不爲空的空對象

我嘗試這樣做:

if(myObject.Data == null) 
{ 
    Console.WriteLine("Null Object") // <-- Breakpoint here 
} 

當我將斷點命中,我可以看myObject.Data的確是NULL,但是當我打F10,然後進入下一行(這是}) myObject.Data是而不是 NULL。 我還增加了myObject的鎖

如果之前....

,以確保沒有人使用對子級這個對象。

這怎麼可能,我該怎麼辦?

+0

你鎖定什麼? – 2010-05-10 09:20:06

回答

8

鎖定myObject意味着你鎖定了myObject指向的對象。如果另一個線程更改myObject的值,則它是一個沒有人鎖定的新對象。

對於鎖,我勸你聲明特定對象,你只能使用鎖定,比如:

private static readonly object MyLock = new object(); 
+1

事實上 - 總是最好使用儲物櫃。請參閱Jon Skeet關於C#多線程的頁面:http://www.yoda.arachsys.com/csharp/threads/ – 2010-05-10 09:21:16

2

聲明

public static object LockObject = new object(); 

在生產者線程做這樣的事情:

lock(LockObject) 
{ 
myObject.Data = .... 
} 

和消費者線程做類似這樣的事情:

lock(LockObject) 
{ 
    if(myObject.Data == null) 
    { 
     Console.WriteLine("Null Object") // <-- Breakpoint here 
    } 
    else 
    { 
    // Do something 
    } 
} 

這應該可以幫到你。

0

使用靜態對象鎖定