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

下面这个程序代码中,在任务中,执行这个代码会有错误, 一个任务可能在另一个任务执行第一个++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 class

SynchronizedEvenGenerator 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());

  }


aluckdog
浏览 448回答 2
2回答

慕尼黑的夜晚无繁华

我个人理解,如果用static修饰 currentEvenValue 可能会更好理解一点,对于两个前自增操作,如果线程A进入执行完第一个++操作就切换到第二个线程B,待线程B执行完以后,此时线程A去执行第二个++操作时,值已经不正确了。接下来用 synchronized 修饰来修正上面的情况,逻辑是对了,但是, 因为执行了2此自增,永远是2的倍数,故判断不会成立,线程就这么无限期执行下去。

慕侠2389804

第二个写法是你自己写的?还是别人那里抄过来的?
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java