Perché mai vorremmo usare un metodo sincronizzato in Enum?

6

Mi sono imbattuto in questa domanda e in un altro paio di le stesse linee.

Mentre sappiamo che la creazione di enum è thread-safe e enums sono per singletons di nascita.

In un certo senso, mi confonde il motivo per cui qualcuno vorrebbe avere un metodo synchronized con in enum . Sì, sono pienamente consapevole che i metodi in enum non sono thread-safe, ma che cosa?

Devono non provare a cambiare lo stato di un enum in qualsiasi modo. Se non siamo preoccupati del cambiamento di stato di un enum, perché mai vorremmo che un metodo in un enum fosse thread-safe.

    
posta Shahzeb 25.05.2012 - 03:16
fonte

2 risposte

9

Se si progetta il enum in modo che i metodi non cambino il suo stato, allora sono per definizione thread-safe. Tuttavia, è possibile introdurre lo stato in enum in modo che le modifiche simultanee diventino un problema.

Dovresti? Probabilmente no. Tuttavia, poiché Java ha la flessibilità di consentire l'accesso simultaneo ai membri di un enum , sono necessari strumenti di sincronizzazione per garantire che il comportamento si verifichi correttamente.

Esempio contrato

Diciamo che vuoi elencare gli ultimi decenni e interrogarli per le frasi che le persone hanno detto quando volevano dire che era "bello". Dal momento che non vuoi favorire nessuna di queste frasi più di un'altra, devi assicurarti che vengano utilizzate uniformemente, anche attraverso i thread. Potresti provare qualcosa del genere:

enum Decades {

    NINETIES( "dope", "fly", "bomb", "tight" ),
    EIGHTIES( "bad", "righteous", "sick", "gnarly" ),
    SEVENTIES( "boss", "choice", "funky" );

    final String[] phrases;
    volatile int currentPhrase = 0;
    Decades( String... phrases ){
        this.phrases = phrases;
    }

    synchronized String getCoolPhrase(){
        final String result = phrases[currentPhrase];
        currentPhrase = (currentPhrase + 1) % phrases.length;
        return result;
    }

}

Se hai familiarità con i classici problemi di concorrenza (ci sono in mente 100 con più thread), saprai che senza sincronizzazione, due thread potrebbero vedere il valore di currentPhrase , recuperare la frase e incrementare allo stesso tempo. Ciò potrebbe comportare usi ripetuti della stessa frase, poiché un thread non sapeva che una frase era già stata utilizzata quando leggeva il contatore.

Frasi interessanti ispirate al link

    
risposta data 25.05.2012 - 03:56
fonte
4

Considera questo esempio: supponiamo che tu voglia fornire una descrizione del tuo enum in una lingua associata con una Locale passata nel tuo metodo. Se la lingua è inglese, fornisci una risposta "in scatola" codificata con la tua classe; se è una lingua diversa, si esegue una query su Google Traduttore, si passa la descrizione in inglese, si ottiene una risposta, lo si memorizza in una mappa per locale all'interno dell'enumerazione e si restituisce all'utente la risposta. L'accesso e la modifica di una cache dovrebbero essere sicuramente sincronizzati.

    
risposta data 25.05.2012 - 03:52
fonte

Leggi altre domande sui tag