用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

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