Есть 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());
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Подскажите, как загрузить библиотеку в Eclipse? Java только начала учить, не получаеться(((
возник вопрос в проектировании отдельной части базе данных, в частности при использовании Spring Security(Java) у меня будет две роил USER и ADMINСоответсвенно...
объект должен быть не MARS, SNICKERS или TWIX а именно ChocolateBars