Java线程同步中使用wait方法发现结果与预期不符,是什么导致的?

作者站长头像
站长
· 阅读数 5

在学习Java线程的同步时,我写了两个线程对同一个int变量进行增加的例子来练习wait方法,却发现最终结果与预期结果不符,具体如下:

这是我的线程类NumPlus1,在线程中会循环输出当前线程名和变量i:

public class NumPlus1 implements Runnable{
    int i = 0;

    @Override
    public void run(){
        Thread now = Thread.currentThread();
        while (i < 5){
            synchronized (this){
                System.out.println(now.getName() + ":" + i++);
                try {
                    wait(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }
}

这是我的main方法,在main方法里启动了两个名字为“one”和“two”的线程:

    public static void main(String[] args) {
        NumPlus1 numPlus = new NumPlus1();
        Thread one = new Thread(numPlus, "one");
        Thread two = new Thread(numPlus, "two");
        one.start();
        two.start();
    }

按线程类中的while循环,预期结果是one线程和two线程打印信息中的i会按0,1,2,3,4走,但最终结果有时符合预期,有时却会多出了一个5,如下图:Java线程同步中使用wait方法发现结果与预期不符,是什么导致的?

请问这是什么原因导致的呢?

回复
1个回答
avatar
test
2024-06-26

i<5 的判断并不在 synchronized 里面,所以判断之后,进入 synchronized 之前,i 是可能会被改变的。

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容