У меня возникла проблема, когда мне приходится иметь дело со многими потоками, которые пытаются написать список строк в базе данных. Чтобы все было ясно, рассмотрим 3 потока, которые обращаются к объекту соединения с БД. Все потоки будут иметь String. Lets sat Thread A имеет строку под названием «First», Thread B имеет «Second», Thread C имеет «First». Предположим, что ниже - критическая часть кода, которую я хочу защитить, вкратце объясню.Использование семафора для размещения определенных потоков в очереди
writeToDataBase(String stringFromEachThread);
Этот метод может выполняться потоками A и Thread B одновременно, поскольку в них есть разные значения строк. Я должен защитить вышеуказанный код, пока Thread A выполняется из Thread C, потому что Thread C также имеет такое же строковое значение, как Thread A. Мне нужно сделать Thread C до тех пор, пока поток A не завершит выполнение. Таким образом, я наткнулся на java.util.Concurrent.Semaphore класс, который помещает потоки в очередь. Но в моем случае только Thread C должен быть помещен в очередь не в Thread B. Поскольку Thread B имеет уникальное строковое значение, поэтому его можно выполнить параллельно с потоком A. Семафор блокирует поток C во время выполнения потока A, но он блокирует поток B также. Bowow - это фрагмент кода, в котором я использую семафор для достижения этого, который до сих пор не помог. Я занимаюсь этой проблемой уже более недели. Любые предложения по его преодолению глубоко признательны.
Semaphore sm = new Semaphore(1, true);
... ...
public void lock(String str) throws InterruptedException {
if(!strAlreadExists()){
return;
}else{
sm.acquire();
}
}
Я бы предпочел использовать [synchronized] (https://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html), прежде чем решил, что мне абсолютно нужны семафоры. Вот хороший учебник по «параллелизму», параметры, которые у вас есть, и компромиссы между этими параметрами: http://www.vogella.com/tutorials/JavaConcurrency/article.html – paulsm4
И сколько строк это? Кроме того, даже если вы выполняете их одновременно, база данных будет сериализовать обращения. Так зачем беспокоиться? – fge
* «База данных будет сериализовать доступ» * - не всегда, это будет зависеть от режима изоляции. –