2010-05-10 99 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

使用静态对象锁定