请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

index + wrong count > real index

老师我的代码如下,我并没有用synchonized,但还是出现了index + wrong count > real index:

package background;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * Two thread increment one variable at the same time
 *
 * @author mixma
 */
public class MultiThreadError implements Runnable {

  static MultiThreadError runnableInstance = new MultiThreadError();

  private int index = 0;
  static AtomicInteger realIndex = new AtomicInteger();
  static AtomicInteger wrongCount = new AtomicInteger();
  private boolean[] marked = new boolean[100000];

  public static void main(String[] args) throws InterruptedException {

    Thread thread1 = new Thread(runnableInstance);
    Thread thread2 = new Thread(runnableInstance);
    thread1.start();
    thread2.start();
    thread1.join();
    thread2.join();
    System.out.println("index: " + runnableInstance.index);
    System.out.println("real index: " + realIndex);
    System.out.println("wrong count: " + wrongCount);
  }

  @Override
  public void run() {

    for (int i = 0; i < 10000; i++) {

      index++;
      realIndex.incrementAndGet();
      if (marked[index]) {

        System.out.println("Race condition error: " + index);
        wrongCount.incrementAndGet();

      }
      marked[index] = true;

    }

  }

}

某一次的输出:
输出

正在回答 回答被采纳积分+3

1回答

提问者 Barea 2020-06-20 12:20:45

仔细想了一下好像原因应该也和有synchronized的代码一样,某个线程在想检查if (marked[index])的时候index被另一个线程+1了,所以提前把下一个index的marked值改成了true,于是另一个线程在检查if (marked[index])的时候发现已经被改成true了,所以wrong count也就+1了

0 回复 有任何疑惑可以回复我~
  • 悟空 #1
    恩,给小伙伴的仔细思考点赞
    回复 有任何疑惑可以回复我~ 2020-06-21 01:04:56
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信