关于线程同步lock的问题

mykeylock 2014-09-10 06:36:15
现在我用C#写的程序,
1、有两个界面,
2、这两个界面都有调用另外一个cs类文件,
3、并且两个界面都有两个定时器运行,
4、两个界面的两个定时器都要调用这同一个类的同一个方法。
这种情况下该怎么使用线程同步?不用线程同步肯定出问题。
我的实现方法是:这个cs类文件的class不加任何限定符,也就是interval类型的,里面的这个方法我用public static,这个方法里的代码都在lock(ob1){ }的大括号中。这里的ob1我用的是别的类里的public static ob1 = new object();
这样运行后发现没有实现线程同步,还是会有冲突,软件崩溃,之前没有用过线程同步,刚学的,求各位大神帮忙。
...全文
373 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
小枪 2014-09-13
  • 打赏
  • 举报
回复
多线程才需要lock 同步是单线程
threenewbee 2014-09-11
  • 打赏
  • 举报
回复
不要把静态共有变量拿来lock,原则性的错误。 然后要看你的代码了。
於黾 2014-09-11
  • 打赏
  • 举报
回复
lock对象必须是同一个,才能互相锁住 因为编译器是允许你同时有多对锁的,所以才需要你传递一个锁定的对象作为标识啊 比如下面的例子: fun1() { lock(a){} } fun2() { lock(a){} } fun3(){lock(b){}} fun4(){lock(b){}} 那么1和2互斥,3和4互斥,1和3可以同时执行 那么如果你在类里做lock,要么被lock的对象是在类外面定义的一个公共变量,要么是在类里定义的静态变量 否则每实例化一次,类里的变量都多一个实例出来,各自锁定不同的实例,编译器哪知道你是想各个实例之间互斥啊
zhengnan2012 2014-09-11
  • 打赏
  • 举报
回复
引用 3 楼 caozhy 的回复:
不要把静态共有变量拿来lock,原则性的错误。 然后要看你的代码了。
如果不lock静态共有变量,那么lock还有什么用呢?主要不是为了实现同步吗?如果lock一个非静态本类的成员变量,那么我这样子使用你看会不会出问题 while(true){//这里假设很多,用true表示 A a=new A(); a.Foo(); } 那么这段代码调用Foo里面就完全没有起到同步的作用啊.反而我觉得应该是要lock静态变量,主要是看什么个用法.当然如果临界资源不会超本类,那么lock非静态变量是正常的.
zhengnan2012 2014-09-11
  • 打赏
  • 举报
回复
你lock另一个类里面的obj1这个没有什么用,就是一片混乱. 你两个界面调一个类,直接类里面lock本类的静态对象obj1就可以了.
mykeylock 2014-09-11
  • 打赏
  • 举报
回复
错了,,每个界面一个定时器。。这两个定时器会用相同的public static方法操作数据库,具体在使用的时候问题的原因是:定时器1可能刚把数据库打开,但方法还没运行结束,这个时候定时器2马上又把数据库关闭了,这个时候再转到定时器1的方法就出问题了。所以必须要线程同步。问题自己解决了,不过确实用的是lock锁定另一个类文件中的public static 的object对象引用。另外还试了一下在这个方法上加[MethodImpl(MethodImplOptions.Synchronized],这个是针对单独一个方法的同步,不再针对整个引用。虽然有不妥之处,但暂时没有什么更好的办法。。。
於黾 2014-09-11
  • 打赏
  • 举报
回复
两个界面,每个界面都有2个定时器,还都调用静态方法 这个跟线程有任何关系??
  • 打赏
  • 举报
回复
把你的“冲突的”代码贴出来。具体搞清楚什么语句冲突,“崩溃”的机制,不要滥用什么“同步”这个词儿。
mykeylock 2014-09-10
  • 打赏
  • 举报
回复
两个界面文件中都有new出来新的类的实例,但由于这个方法是public static的,所以new的不同的类对象不影响吧。

110,526

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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