为了账号安全,请及时绑定邮箱和手机立即绑定

关于不正确多线程资源共享问题的程序代码,想请教问题

关于不正确多线程资源共享问题的程序代码,想请教问题

aluckdog 2019-03-06 11:14:04
下面这个程序代码中,在任务中,执行这个代码会有错误, 一个任务可能在另一个任务执行第一个++currentEvenValue时,第二个++currentEvenValue前调用next() -------这边为什么会出现问题,第一个任务与另一个任务有不相关,为什么会是不正确的资源共享?public class EvenGenerator extends IntGenerator {  private int currentEvenValue = 0;  public int next() {    ++currentEvenValue; // Danger point here!    ++currentEvenValue;    return currentEvenValue;  }  改进后的版本中,使用使用synchronized 关键字,使得在被一个任务调用,其他任务不能执行这个代码,但中Thread . yield ( ) -- 意思是暂停当前程序,并其他线程,那不是与synchronized的本意想违背吗? 不又回到了改进之前程序吗? 执行任务执行程序代码时,可能有其他任务调用这个next ()方法public classSynchronizedEvenGenerator extends IntGenerator {  private int currentEvenValue = 0;  public synchronized int next() {    ++currentEvenValue;    Thread.yield(); // Cause failure faster    ++currentEvenValue;    return currentEvenValue;  }  public static void main(String[] args) {    EvenChecker.test(new SynchronizedEvenGenerator());  }} 
查看完整描述

2 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

我个人理解,如果用static修饰 currentEvenValue 可能会更好理解一点,对于两个前自增操作,如果线程A进入执行完第一个++操作就切换到第二个线程B,待线程B执行完以后,此时线程A去执行第二个++操作时,值已经不正确了。

接下来用 synchronized 修饰来修正上面的情况,逻辑是对了,但是, 因为执行了2此自增,永远是2的倍数,故判断不会成立,线程就这么无限期执行下去。


查看完整回答
反对 回复 2019-04-18
?
慕侠2389804

TA贡献1719条经验 获得超6个赞

第二个写法是你自己写的?
还是别人那里抄过来的?

查看完整回答
反对 回复 2019-04-18
  • 2 回答
  • 0 关注
  • 447 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信