数组上的同步未按预期显示结果

时间:2016-06-29 09:11:02

标签: java arrays concurrency locking synchronize

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    

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

2 个答案:

答案 0 :(得分:1)

Synchronized仅在两个或多个线程尝试访问SAME数据时触发。在您的情况下,您的2个线程都运行ThreadDemo类的单独实例,因此是一个单独的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);

在这种情况下,两个线程都在相同的数据上运行。

答案 1 :(得分:0)

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