阵列上的同步未按预期显示结果
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);
在这种情况下,两个线程都对相同的数据进行操作。
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);
在这种情况下,两个线程都对相同的数据进行操作。