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