This topic has been archived. It cannot be replied.
-
工作学习 / IT技术讨论 / .net问题:谢谢。我有如下一段程序:
if _class1 is nothing then
_class1=new class1
endif
现在,我用各种办法确信了(_class is nothing) 为真,但是为什么就是不执行里面的语句,而是直接跳到endif了呢。
我确信是同一个线程。
-lilyba(sunshine 顶风作案);
2004-11-19
{207}
(#1989650@0)
-
胡说.怎么不执行?!
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If _class1 Is Nothing Then
_class1 = New Class1
Button1.Text = "250"
End If
执行的好好的.
-dakandao(~相留醉~);
2004-11-19
{262}
(#1989677@0)
-
你这种做法是线程不安全的。建议你改用thread-safe singleton试试看
-isup(isup);
2004-11-19
(#1989679@0)
-
我检查线程了,是同一个线程下来的。
-lilyba(sunshine 顶风作案);
2004-11-19
(#1989883@0)
-
多线程情况下,debug看到的是不准确的。这段代码加上一个线程锁,再试试看有可能你的这个线程的代码,在你设置断点时看到的的确为空,真的走到代码这里,其值已经被其他线程修改了。最好的办法是加一个线程锁,但是在有的情况下,比如真正多CPU的情况下,也不能保证代码一定正确。不过一般情况下就够用了。
这个是经典的singleton问题。线程不安全的代码,在多线程的情况下,就是错误的代码。
-isup(isup);
2004-11-19
{298}
(#1989898@0)
-
我debug过程中,quick watch 检查"_class1 is nothing", 结果为true.
-lilyba(sunshine 顶风作案);
2004-11-19
(#1989884@0)
-
偶回的帖子怎么没有了? 偶遇到过条件为真不进去的,在MSN上跟你说了。
-henhen(亨亨 ^_^);
2004-11-19
(#1989902@0)
-
谢谢,我msn 还在另一台机器上。我查察看。
-lilyba(sunshine 顶风作案);
2004-11-19
(#1989917@0)
-
共享一下嘛,谢谢
-camryv6(busy!!!);
2004-11-19
(#1989925@0)
-
可以进去,我试过了测试代码如下:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim a As TestClass
If (a Is Nothing) Then
a = New TestClass
End If
End Sub
Public Class TestClass
Public i As Integer
End Class
-bobo123(bobo);
2004-11-20
{311}
(#1990604@0)
-
单线程下要是这样的代码还有问题,微软早就出补丁把它补好了。这段代码在单线程下肯定没问题,多线程下就难说了。
-isup(isup);
2004-11-20
(#1990751@0)