Tutti i componenti di Swing sono implementati per l'accesso da un singolo thread (il thread di dispacciamento dell'evento). Quindi non ci sono protezioni contro accessi concorrenti e modifiche simultanee di variabili e campi.
Se siete fortunati, tutto funziona bene. Ma non puoi fare affidamento su di esso e lo stesso codice può avere enormi problemi alla prossima esecuzione.
Un semplice esempio:
La procedura di vernice di un JLabel contiene il codice seguente (semplificato) (tratto da BasicLabelUI
classe):
# assume your label is enabled
Icon icon = (label.isEnabled()) ? label.getIcon() : label.getDisabledIcon();
# what happens if another thread calls label.setEnabled(false) at this point?
if (icon != null) {
icon.paintIcon(c, g, paintIconR.x, paintIconR.y);
}
if (label.isEnabled()) {
paintEnabledText(label, g, clippedText, textX, textY);
}
else {
paintDisabledText(label, g, clippedText, textX, textY);
}
Per esempio se si chiama setEnabled() da altri thread rispetto all'EDT, sarebbe possibile ottenere un'etichetta con l'icona abilitata, ma il testo dipinto disabilitato.
* "Potrebbe succedere qualcosa di brutto?" * - Sì. In poche parole, Swing non è thread-safe, non protegge da più thread l'accesso a proprietà diverse, il che significa che si entra in uno stato incoerente. Ricorda che non controlli il processo di verniciatura, quindi qualcosa potrebbe essere dipinto mentre lo stai cambiando ... questi problemi sono difficili da replicare e rintracciare e la cosa peggiore è che sembrano accadere solo sulle macchine degli utenti .. .. – MadProgrammer
Non illuderti, questa è davvero, davvero pericolosa e davvero una pessima idea – MadProgrammer
1. perché, 2. la mia curiosità è davvero un motivo per pubblicare una domanda su, 3. nota c'è un'enorme differenza nella sicurezza del thread tra Java6 e Java7/8, 4. voto per chiudere come troppo ampio (senza un SSCCE/MCVE, breve, eseguibile, compilabile, con valore hard per la GUI Swing nella variabile locale) – mKorbel