Есть 10 одновременно работающих потоков, которые добавляют один элемент (в синхронизированом блоке) в LinkedList. Но, в итоге, добавляется не 10 элеметов, а меньше. Возможно, я не совсем понимаю работу synchronized блока. Может кто-нибудь объяснить причину неправильной работы и предложить способ синхронизации получше?
Код потока:
import java.util.LinkedList;
public class TestThread extends Thread {
private LinkedList<String> lks;
public TestThread(LinkedList<String> lks) {
this.lks = lks;
}
public void run() {
synchronized(lks) {
lks.add("a");
}
}
}
Код главного метода:
import java.sql.SQLException;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.ExecutionException;
public class Test {
public static void main(String []args) throws SQLException, IOException, ExecutionException {
List<TestThread> t = new ArrayList<TestThread>();
LinkedList<String> lks =new LinkedList<String>();
for(int i=0;i<10;i++) {
t.add(new TestThread(lks));
}
t.parallelStream().forEach(x->x.start());
System.out.println(lks.size());
}
}
synchronized отрабатывает корректно, но вы не дожидаетесь окончания работы всех тредов. Если сделать join() всем тредам, в списке всегда будет 10 элементов.
t.parallelStream().forEach(x -> x.start());
t.forEach(x -> {
try {
x.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
System.out.println(lks.size());
Сборка персонального компьютера от Artline: умный выбор для современных пользователей