Fresh.587 2021-12-10 20:13 采纳率: 88%
浏览 11
已结题

用synchronized上锁之后各线程求和正确,求五个线程的和不正确


package javaapplication31;


public class JavaApplication31 {

    
    public static void main(String[] args) {
       QiuheThread q[]=new QiuheThread[5];
       for(int i=0;i<5;i++)
       {
           q[i]=new QiuheThread(i);
           q[i].start();
       }
       int he=q[0].sum+q[1].sum+q[2].sum+q[3].sum+q[4].sum;
       System.out.print("1-100求和为:"+he);
    }
    
}
class QiuheThread extends Thread
{
    int index;
    int sum;
    public QiuheThread(int nindex)
    {
        index=nindex;
    }
   
    public void run()
    {
        sum=0;
        int i;
        
            for(i=0;i<20;i++)
            {
                sum+=index*20+i+1;  
            }
            System.out.println(sum);
           add(sum);
    
    }
     public synchronized void add(int num)
    {
        sum+=num;
    }
}

想用五个线程求1-100的和,第一个线程求1-20以此类推,给sum加锁之后单个线程求和正确,总体之不正确是怎么回事?求指点🙏

img

  • 写回答

1条回答 默认 最新

  • Winson.J 2021-12-11 17:53
    关注

    第15行的代码,不会等5个线程都执行结束,再执行。
    线程正在做计算的时候,15行就执行了,所以结果不对,而且这个结果是随机的。
    这个不是锁造成的。就当前代码功能来说,可以不加锁。
    解决办法可在13行后面加上 q[i].join();
    或者使用CountDownLatch类。来保证所有线程执行完,才执行第15行代码。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 3月15日
  • 已采纳回答 3月7日
  • 创建了问题 12月10日

悬赏问题

  • ¥15 依据报错在原代吗格式的基础上解决问题
  • ¥15 在虚拟机中安装flash code
  • ¥15 单片机stm32f10x编写光敏电阻调节3.3伏大功率灯亮度(光强越大灯越暗,白天正常光强灯不亮,使用ADC,PWM等模块)望各位找一下错误或者提供一个可实现功能的代码
  • ¥20 verilog状态机方法流水灯
  • ¥15 pandas代码实现不了意图
  • ¥15 GD32H7 从存储器到外设SPI传输数据无法重复启用DMA
  • ¥25 LT码在高斯信道下的误码率仿真
  • ¥45 渲染完成之后将物体的材质贴图改变,自动化进行这个操作
  • ¥15 yolov5目标检测并显示目标出现的时间或视频帧
  • ¥15 电视版的优酷可以设置电影连续播放吗?