Я новичок в пулах потоков и учусь использовать 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);
}
}
В этом коде условие гонки принимается с заботойoff:
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);
}
}
Но я думаю, что во второй реализации нет смысла использовать потоки, так как выполнение будет "своего рода" последовательным. Поскольку только один поток из двух будет иметь доступ к объектному монитору, в то время как другой будет ожидать выполнения первого потока и будет иметь доступ к монитору только после завершения первого. Это звучит как последовательное.
Пожалуйста, поправьте меня, если я ошибаюсь. Любая помощь высоко ценится.