线程安全问题,我下面的想法是交替执行sout(i),为什么报错


public class CommunicationTest {
    public static void main(String[] args) {

        Number n1 = new Number();
        n1.setName("线程1");
        n1.start();
        Number n2 = new Number();
        n2.setName("线程2");
        n2.start();
    }
}
class Number extends Thread{
    private  static  int i ;
    @Override
    public void run() {
            for(;;) {
                synchronized (Number.class) {
                    notify();
                if(i <= 100) {
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                    System.out.println(getName() + ":" + i);
                    i++;
                    try {
                        wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }else{
                    break;
                }
            }
        }
    }
}

(1)静态变量 i 没有初始化啊。
private static int i =0;
(2)notify()和wait()的使用不对。
修改后运行结果:

img

Number类修改如下:


public class Number extends Thread{
    private  static  int i =0;

    @Override
    public void run() {
        for(;;) {
            synchronized (Number.class) {
                Number.class.notify();//注意这里加上加锁的对象
                
                if(i <= 100) {
                    try {
                        Thread.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(getName() + ":" + i);
                    i++;

                    try {
                        Number.class.wait();//注意这里加上加锁的对象
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }else{
                    break;
                }
            }
        }
    }
}

当某个线程获取到锁后,发现当前还不满足执行的条件,就可以调用对象锁的wait方法,进入等待状态。
只有已经获取锁的线程,才可以调用锁的wait、notify方法,否则会抛出异常IllegalMonitorStateException。

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632