Wszystkie składniki piłowania są realizowane być dostępne z jednej nici (dla wątku zdarzenie wysyłki). Tak więc nie ma żadnych zabezpieczeń przeciwko współbieżnemu dostępowi i jednoczesnym zmianom zmiennych i pola.
Jeśli masz szczęście, wszystko działa dobrze. Ale nie można na nim polegać, a ten sam kod może mieć ogromne problemy przy następnym uruchomieniu.
Prosty przykład:
Procedura farby z JLabel zawiera następujące (uproszczony) kod (wzięte z BasicLabelUI
klasa):
# 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);
}
Na przykład jeśli zadzwonisz setEnabled() z innych wątków niż EDT byłoby możliwe, że otrzymasz etykietę z włączoną ikoną, ale wyłączony tekst malowany.
* "Czy może się zdarzyć coś złego?" * - Tak. Mówiąc krótko, Swing nie jest bezpieczny dla wątków, nie chroni przed dostępem wielu wątków do różnych właściwości, co może oznaczać, że staniesz się niespójny. Pamiętaj, że nie kontrolujesz procesu malowania, więc coś może się malować, gdy zmieniasz to ... te problemy są trudne do powielenia i śledzenia, a co gorsza, wydają się zdarzać tylko na komputerach użytkowników .. .. – MadProgrammer
Nie oszukujmy się, to jest naprawdę, naprawdę niebezpieczny i naprawdę, naprawdę zły pomysł – MadProgrammer
1. dlaczego, 2. moja ciekawość jest naprawdę powodem, by zadać pytanie na temat, 3. zauważ, że jest ogromna różnica w bezpieczeństwie Nici pomiędzy Java6 i Java7/8, 4. głosowanie na zakończenie jako zbyt szerokie (bez SSCCE/MCVE, krótkie, działające, kompilowalne, z zakodowaną wartością dla Swing GUI w zmiennej lokalnej) – mKorbel