阵列上的同步未按预期显示结果

synchronize on array is not showing outcome as expected

public class ThreadDemo implements Runnable {
Integer ar [] =  new Integer[100];


@Override
public void run() {


synchronized (ar) {
    System.out.println("Start: In run method");
    for(int i =0; i<100;i++)
    {
        ar[i]=i;
    }

    for(int i=0;i<100; i++)
    {
        ar[i]= ar[i]*1000;
        System.out.println(ar[i]+"\t");
    }
    System.out.println("End:in run method");
}



}

我从线程池创建两个线程的其他驱动程序调用

Executor task   =  Executors.newFixedThreadPool(10);
    task.execute(new ThreadDemo());
    task.execute(new ThreadDemo());

输出:

Start: In run method
Start: In run method
0   
0   
1000    
1000    
2000    
2000    
3000    
3000    

为什么两个线程在数组已经同步的情况下同时访问数组。理想情况下,当一个线程访问数组时,它会获取该数组上的锁,在这种情况下,其他线程应该等待,直到第一个线程没有离开数组上的锁。

这是因为您使用了两次 new ThreadDemo()。每个线程都有自己的数组对象。您可能希望将整数数组声明为静态或选择不同的实现。

Synchronized 仅在两个或多个线程尝试访问相同数据时触发。在您的情况下,您的 2 个线程都是 运行 ThreadDemo class 的单独实例,因此是一个单独的 ar 数组。所以您看到的行为符合预期。

尝试替换这个:

Executor task   =  Executors.newFixedThreadPool(10);
task.execute(new ThreadDemo());
task.execute(new ThreadDemo());

通过这个:

Executor task   =  Executors.newFixedThreadPool(10);
ThreadDemo td = new ThreadDemo();
task.execute(td);
task.execute(td);

在这种情况下,两个线程都对相同的数据进行操作。