【发布时间】:2021-04-11 08:34:23
【问题描述】:
我有以下工人阶级 -
public class Worker implements Runnable {
private int workId;
public Worker(int workId) {
this.workId = workId;
}
private int count = 0;
private synchronized void increment() {
System.out.println("Work id: " + workId);
System.out.println("Incrementing...");
Thread.sleep(5000);
count++;
System.out.println("Incremented");
}
@Override
public void run() {
increment();
}
}
我有以下主要方法-
ExecutorService executorService = Executors.newFixedThreadPool(2);
for (int i = 1; i <= 10; i++) {
executorService.submit(new Worker(i));
}
executorService.shutdown();
System.out.println("All tasks submitted");
executorService.awaitTermination(1, TimeUnit.DAYS);
System.out.println("All tasks completed");
此处increment() 已同步。因此,当 1 个线程占用它时,另一个线程必须等到该线程离开锁。
但是当我使用 2 个线程的线程池提交工作时,两个线程似乎同时使用 increment()。
那么在这里我怎样才能强制两个线程一次只使用一个increment() 方法呢?
【问题讨论】:
-
最后你想要什么?现在你有 10 个
Worker对象,有 10 个单独的计数器。 -
我希望当 1 个工作人员正在处理同步任务时,该工作人员必须在该任务上拥有一个排他锁,并且在第一个工作人员完成任务并释放锁之前,另一个工作人员不能执行相同的任务.
-
您在工作对象 (
this) 上进行同步。如果您有多个工作对象,那么它们确实可以并行运行。
标签: java multithreading threadpool executorservice synchronized