L'uso della sincronizzazione nel livello di servizio è una cattiva idea?

0

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?

    
posta Sher10ck 29.07.2015 - 19:15
fonte

0 risposte

Leggi altre domande sui tag