疑问:我正在通过编辑代码来尝试一些新的东西。当我从 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 ,其中您的线程将写入某些共享数据结构!否则,每个线程仅做自己的工作。完全独立于其他线程在做什么!