Devo implementare un sistema di monitoraggio delle cassette postali come servizio web. Ho seguito le lezioni:
MailboxMonitor
: contiene informazioni come nome utente, password, intervallo di trascinamento ecc.
MailboxMonitorRepository
: recupera e memorizza MailboxMonitor
dal database.
ExternalService
: riattiva ed elabora i messaggi di posta elettronica in base alla data istanza di MailboxMonitor
.
Ecco alcuni frammenti di codice:
MailboxMonitorController{
public void update(MailboxMonitor monitor){
mailboxService.update(monitor);
}
}
MailboxMonitorService{
public void update(MailboxMonitor monitor){
synchronized(this){
mailboxMonitorRepository.update(monitor);
externalService.update(monitor);
}
}
}
Il motivo per cui utilizzo la sinconizzazione qui è cercare di gestire le condizioni di gara.
Supponi che threadA
aggiorni un monitor che trascina l'intervallo a 5 minuti e allo stesso tempo threadB
prova ad aggiornare lo stesso intervallo del monitor a 1 minuto. Ecco un percorso di esecuzione affidabile senza sincronizzazione:
database di aggiornamento threadA - > database di aggiornamento di threadB - > threadB aggiorna il servizio esterno - > threadA aggiorna il servizio esterno
Ciò che finisce è che il database afferma che l'intervallo di prelievo è di 1 minuto, tuttavia, il servizio esterno estrae ed elabora le email ogni 5 minuti.
L'aggiunta della sincronizzazione qui danneggerà le prestazioni. I thread che tentano di aggiornare diversi monitor si bloccheranno a vicenda. Sento che sto facendo qualcosa di sbagliato. Eventuali suggerimenti?