疑问:我正在通过编辑代码来尝试一些新的东西。当我从 SumArray的 SumArray方法中删除了Synchronized关键字时,从 SumThread中存在的静态SyncSumArray 中删除了Static时,通过代码显示的输出感到惊讶。程序的两个版本都返回,且具有相同的总和值。
这是由于静态对象引起的还是由其他原因导致的?

      class SyncSumArray
>     {
>         private int sum=0;
>
>        synchronized  int sumArray(int nums[])
>         {
>           sum=0; // reset sum
>
>             for(int i=0;i<nums.length;i++)
>           {  sum+=nums[i];
>             System.out.println("Running total for "+Thread.currentThread().getName()+" is "+ sum);
>             try{
>                 Thread.sleep(100);  // allow task switch
>             }
>             catch(InterruptedException e)
>             {
>                 System.out.println("Threadinterrupted");
>             }
>         }
>         return sum;
>     }
>     }
>     class SumThread implements Runnable
>     { Thread thrd;
>        static SyncSumArray sa=new SyncSumArray();
>         int a[];
>         int answer;
>
>         SumThread(String name,int nums[])
>         {   thrd=new Thread(this,name);
>             a=nums;
>             thrd.start();
>         }
>
>         // Begin execution of new Thread
>
>         public void run()
>         {
>             int sum;
>             System.out.println(thrd.getName()+" starting.");
>
>             answer=sa.sumArray(a);
>             System.out.println(" Sum for "+ thrd.getName()+" is " +answer);
>             System.out.println(thrd.getName() + " terminating.");
>         }
>     }
>     class DemoSync
>     {
>         public static void main(String args[])
>         {
>             int a[]={1,2,3,4,5};
>
>             SumThread mt1=new SumThread("Child #1",a);
>              SumThread mt2=new SumThread("Child #2",a);
>
>              try
>              {
>                  mt1.thrd.join();
>                  mt2.thrd.join();
>                 }
>                 catch(InterruptedException e)
>                 { System.out.println("Main thread interrupted.");
>                 }
>             }
>         }

最佳答案

关键是:使用“本地”计数器迭代数组并汇总所有元素,无论并行并行计数的线程数如何,都不会改变。

为了查看多线程的“副作用”,您需要进行某种 Activity ,其中您的线程写入某些共享数据结构!否则,每个线程仅做自己的工作。完全独立于其他线程在做什么!

10-06 14:02