空对象不为空

时间:2010-05-10 09:15:58

标签: c# object null multithreading

我使用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上添加了一个锁
  

如果....

确保没有人会使用这个物体。

这怎么可能,我该怎么办?

3 个答案:

答案 0 :(得分:8)

锁定myObject意味着你要锁定myObject引用的对象。如果另一个线程更改了myObject的值,则它是一个没有人锁定的新对象。

对于锁,我建议您声明仅用于锁定的特定对象,例如:

private static readonly object MyLock = new object();

答案 1 :(得分: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
    }   
}

这应该会帮助你。

答案 2 :(得分:0)

使用静态对象进行锁定