Я ищу рекомендацию о том, как сделать этот код потокобезопасным с блокировками на Java. Я знаю, что есть много исправлений с замками; непонятные проблемы, расовые условия и т. д., которые могут появиться. Вот основная идея о том, что я пытаюсь достичь, реализуемый довольно наивным:Использование Java Queued Locks
public class MultipleThreadWriter {
boolean isUpgrading=false;
boolean isWriting=false;
public void writeData(String uniqueId) {
if (isUpgrading)
//block until isUpgrading is false
isWriting = true;
{
//do write stuff
}
isWriting = false;
}
public void upgradeSystem() {
if (isWriting)
//block until isWriting is false
isUpgrading = true;
{
//do updates
}
isUpgrading = false;
}
}
Основная идея заключается в том, что несколько потоков разрешено записывать данные одновременно. Это не имеет значения, так как никакие два потока никогда не будут записывать данные, относящиеся к одному и тому же уникальному. Тем не менее, «обновление системы» управляет данными для всех уникальных идентификаторов, поэтому оно должно блокировать (ждать в строке), пока не будут записаны данные до того, как они начнутся, и в этот момент он блокирует все записи до тех пор, пока они не будут завершены. (Это определенно не шаблон потребления/производителя, происходящий здесь - обновление происходит произвольно, то есть не имеет никакого отношения к записываемым данным.)
Спасибо. Основываясь на вашей идее, я создал это решение: 'public class MultipleThreadWriter { private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); закрытый конечный замок r = rwl.readLock(); закрытый финал Lock w = rwl.writeLock(); \t \t \t общественный недействительный WriteData() { \t \t \t r.lock(); \t \t попробовать {\t \t \t \t // делать записи вещи \t \t \t} наконец { \t \t \t р.разблокировать(); \t \t} \t \t \t \t } \t \t общественного недействительными upgradeSystem() { \t \t \t \t w.lock(); \t \t попробовать { \t \t \t // делать обновления \t \t} наконец { \t \t \t w.unlock(); \t \t} \t} } ' – bitsmcgee77
К сожалению о неразборчивом коде в комментариях! Не могу понять, насколько я должен правильно отформатировать его. – bitsmcgee77