Synchronized блок не работает

201
22 мая 2018, 11:10

Есть 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());         
    }
}
Answer 1

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());
READ ALSO
Библиотеки Java [закрыт]

Библиотеки Java [закрыт]

Подскажите, как загрузить библиотеку в Eclipse? Java только начала учить, не получаеться(((

224
Помощь в проектировании таблиц в базе данных

Помощь в проектировании таблиц в базе данных

возник вопрос в проектировании отдельной части базе данных, в частности при использовании Spring Security(Java) у меня будет две роил USER и ADMINСоответсвенно...

220
как создать объект типа enum

как создать объект типа enum

объект должен быть не MARS, SNICKERS или TWIX а именно ChocolateBars

187
ImageIO не подгружает файл из ресурсов?

ImageIO не подгружает файл из ресурсов?

Работаю с tray для загрузки иконки использую,

218