xzdjsnb 2022-04-28 17:46 采纳率: 92.2%
浏览 60
已结题

线程安全问题,我下面的想法是交替执行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;
                }
            }
        }
    }
}
  • 写回答

3条回答 默认 最新

  • 关注

    (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;
                    }
                }
            }
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 5月7日
  • 已采纳回答 4月29日
  • 创建了问题 4月28日

悬赏问题

  • ¥15 PointNet++的onnx模型只能使用一次
  • ¥20 西南科技大学数字信号处理
  • ¥15 有两个非常“自以为是”烦人的问题急期待大家解决!
  • ¥30 STM32 INMP441无法读取数据
  • ¥15 R语言绘制密度图,一个密度曲线内fill不同颜色如何实现
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧,别用大模型回答,大模型的答案没啥用
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。