紧急解决怪现象 高手速进 200高分(静态方法调用问题) 回答上来全是你的

UFONe 2009-12-17 07:55:43
有一类
class aaa
{
public static string str ;
public static void med1(string s)
{
str=s;
}
}

在其他处连续调用该类中静态方法

class bbb
{
void med2()
{
aaa.med1("1");
string s1=aaa.str;
aaa.med1("2");
string s2=aaa.str;
//这里断点
}
}
执行med2方法 有时候正确 s1是1 s2是2
但有时候 s1和s2都是1(程序运行比较快时)
是不是在aaa方法结束时 由于静态变量依赖于类 并未被及时释放所以导致str的值第2次没赋上还是1,
或是线程在第2次调用med1方法时没用同步。
谁给我解释下什么原因造成的,该如何解决?
有人说aaa中赋值时这样写 lock (typeof(string)) 我试了下根本不好使
{
str = s;
}
...全文
282 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
wgzn2000 2009-12-21
  • 打赏
  • 举报
回复
学习
soaringbird 2009-12-19
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 vrhero 的回复:]
引用 13 楼 vrhero 的回复:
主号提问马甲回?

果然被我猜中了,倒粪帖...
[/Quote]
楼主露馅了,浪费人的感情
卧_槽 2009-12-18
  • 打赏
  • 举报
回复
我在火星测试楼主代码一切正常,没有错误。Over.
足球中国 2009-12-18
  • 打赏
  • 举报
回复
确定这两个属性是静态的。

把类搞能静态的试试。
public static class


___________________________________
我写的vs2005源代码管理器,只有团队资源管理中源码管理的功能。
http://topic.csdn.net/u/20091203/10/ca40b678-5443-4a18-a9f6-fad9051d0797.html
  • 打赏
  • 举报
回复
搞不灵
Dobzhansky 2009-12-18
  • 打赏
  • 举报
回复
各位先想一下, 楼主的那个字符串量是否需要同步如何?
cuike519 2009-12-18
  • 打赏
  • 举报
回复
这很明显是一个多线程并发的问题,这个和静态函数没有关系,关键问题在那个静态变量上。

简单说下出现你说的情况的原理:

假如有两个线程:t1,t2同时执行这段代码:
Windows是一个抢占式的操作系统,线程的执行依赖操作系统的调度,准确的说你不知道哪个线程什么时间被执行什么时间被挂起,基于这个原理理论上来说你最终看到的值可能是1,1也可能是1,2也可能是2,2。

这种场景很容易模拟,你在设置断点的时候只要在多个线程之间切换调试即可。

解决这个问题通过lock来讲med2作为一个原子操作完成,也就是说在med2在执行的过程中其他线程即使获得CUP时间也不可能执行这段代码,它需要等待正在持有这个临界区的线程完成之后才可进入这个代码段。
skyworth98 2009-12-18
  • 打赏
  • 举报
回复
threading, racing...
L397230427 2009-12-18
  • 打赏
  • 举报
回复
学习学习
wang_cheng_peng123 2009-12-18
  • 打赏
  • 举报
回复
class aaa
{
public static string str ;
public static void med1(string s)
{
str=s;
}
}

class bbb
{
private object obj=new object();
void med2()
{
lock(obj){
aaa.med1("1");
string s1=aaa.str;
aaa.med1("2");
string s2=aaa.str;
//这里断点
}
}
}

单线程不会有问题,多线程的话这样应该就不会有问题了.
cjnkd 2009-12-18
  • 打赏
  • 举报
回复
单线程不会出现楼主说的情况吧,多线程时候应该加锁处理一下。
wartim 2009-12-18
  • 打赏
  • 举报
回复
static object obj=new object;
wartim 2009-12-18
  • 打赏
  • 举报
回复
你同步错了地方,med1里要同步什么,要同步的是med2
static obj=new object;

class bbb
{
void med2()
{
lock (obj)
{
aaa.med1("1");
string s1=aaa.str;
aaa.med1("2");
string s2=aaa.str;
}
}
}
UFONe 2009-12-18
  • 打赏
  • 举报
回复
还有有能解决的了?
vrhero 2009-12-18
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 vrhero 的回复:]
主号提问马甲回?
[/Quote]
果然被我猜中了,倒粪帖...
HarveyYan 2009-12-17
  • 打赏
  • 举报
回复
再细看一下,有死锁 :-<
med2不能再这样锁了。

[Quote=引用 15 楼 edward8819 的回复:]
class aaa
{
    public static string str ;
    public static object obj=new object();
    public static void med1(string s)
    {
        lock(obj){
        str=s; }
    }
}

class bbb
{
    void med2()
    {
        lock(aaa.obj){
        aaa.med1("1");
        string s1=aaa.str;
        aaa.med1("2");
        string s2=aaa.str;
        //这里断点
              }
    }
}

[/Quote]
HarveyYan 2009-12-17
  • 打赏
  • 举报
回复
class aaa
{
public static string str ;
public static object obj=new object();
public static void med1(string s)
{
lock(obj){
str=s; }
}
}

class bbb
{
void med2()
{
lock(aaa.obj){
aaa.med1("1");
string s1=aaa.str;
aaa.med1("2");
string s2=aaa.str;
//这里断点
}
}
}
Dobzhansky 2009-12-17
  • 打赏
  • 举报
回复
string 这样的东西需要同步么? 我还不确定.
vrhero 2009-12-17
  • 打赏
  • 举报
回复
主号提问马甲回?
super84611 2009-12-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wuyq11 的回复:]
多线程导致的。用单线程如何
[/Quote]
如何用单线程?
加载更多回复(11)

7,765

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧