【发布时间】:2020-03-05 21:40:17
【问题描述】:
我是线程池的新手,正在学习使用synchronized
此代码存在竞争条件问题:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit ;
public class Counter implements Runnable{
int count;
public Counter(){
count=0;
}
public void run(){
count++;
}
public static void main(String[] args) throws
InterruptedException{
ExecutorService exec=Executors.newFixedThreadPool(2);
Counter task=new Counter();
for (int i=0;i<1000;i++ ) {
exec.execute(task);
}
exec.shutdown();
exec.awaitTermination(50L,TimeUnit.SECONDS);
System.out.println(task.count);
}
}
在此代码中,竞争条件被取消:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit ;
public class Counter implements Runnable{
int count;
public Counter(){
count=0;
}
public synchronized void run(){
count++;
}
public static void main(String[] args) throws
InterruptedException{
ExecutorService exec=Executors.newFixedThreadPool(2);
Counter task=new Counter();
for (int i=0;i<1000;i++ ) {
exec.execute(task);
}
exec.shutdown();
exec.awaitTermination(50L,TimeUnit.SECONDS);
System.out.println(task.count);
}
}
但我认为在第二个实现中使用线程是没有意义的,因为执行将是“某种”顺序的。因为两个线程中只有一个线程可以访问对象监视器,而另一个线程将等到第一个线程的执行,并且只有在第一个线程完成后才会成为监视器的访问权限。这听起来像是顺序的。
如果我错了,请纠正我。非常感谢任何帮助。
【问题讨论】:
-
是的,在这里使用线程是没用的。
-
您可能对AtomicInteger 对象感兴趣,它是
incrementAndGet()方法。
标签: java multithreading threadpool executorservice synchronized