A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑色海 中级黑马   /  2013-10-8 14:12  /  1256 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑色海 于 2013-10-8 14:54 编辑

关键字lock的使用有点疑惑,
如果共享资源是一个循环的时候,该把lock放哪儿才能让多条线程同步,并且不会出现安全问题呢?
  1. class A
  2. {
  3. static string name;
  4. static int age;
  5. public A()
  6. {

  7. }
  8. //public A(string name,int age)
  9. //{
  10. // this.name = name;
  11. // this.age = age;
  12. //}
  13. public void Amethod()
  14. {
  15. A ss = new A();
  16. lock (ss)
  17. {
  18. for (; age < 1000; age++)
  19. {
  20. try { Thread.Sleep(10); }
  21. catch (Exception e) { }
  22. Console.WriteLine(age + Thread.CurrentThread.Name + name);
  23. }
  24. MessageBox.Show("循环完毕。。。");
  25. }
  26. }
  27. }
复制代码
我开了三条辅助线程执行这个方法,当lock在for循环外时会出现1000,1001这样的安全问题,该怎么解决???

1 个回复

倒序浏览
刚刚找到问题,并不是lock位置的原因,而是语句中用于中断线程执行的方法Sleep的问题,调用该方法,线程会放弃CPU执行权限,此处换为SpinWait就可以了。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马