2011-12-06 10 views
6

Kiedy zaczynałem naukę Java, powiedziano mi, aby nie robić System.out.println w aplikacji Java EE. Jednak tak naprawdę nie wiem, z jakiego powodu tego nie robię.Zagrożenie System.out.println w aplikacji Java EE

Jestem w pełni świadomy, że jeśli naprawdę potrzebujemy wydrukować ważne, to powinien on być zalogowany przy użyciu struktury logowania.

Co naprawdę chcę zapytać tutaj: czy istnieje realne zagrożenieże System.out.println zrobić? Czy to powoduje problem z wydajnością?

Odpowiedz

7

To rzeczywiście problem z wydajnością. Jeśli zagłębisz się w kod źródłowy JDK dla System.out, w końcu natrafisz na blok synchronized na strumieniu wyjściowym.

Oznacza to, że jeśli umieścisz wystarczającą liczbę wywołań println w kodzie źródłowym, cała podstawa kodu będzie skutecznie działać w trybie jednowątkowym, ponieważ wszystkie wątki oczekują na blokadę synchronizacji.

Jest tu kilka statystyk, jedno wywołanie println ogólnie nie doprowadzi do przeszukiwania całej aplikacji. Im więcej wywołań println w twoim kodzie, tym bardziej prawdopodobne jest, że dwa lub więcej wątków będzie musiał czekać na siebie nawzajem.

3

W dowolnej aplikacji Java EE istnieje prawdopodobnie wiele aplikacji działających w ramach tej samej maszyny JVM. Jest tylko jeden System.out. Jeśli kilka aplikacji próbuje jednocześnie pisać do System.out, może powodować rywalizację na wyjściu i teoretycznie może wpływać na wydajność.

Dodatkowo, choć niekoniecznie związane z wydajnością, sprawia, że ​​wydruki są bardzo nieprzyjemne i trudne do odczytania - zwłaszcza, jeśli wiele aplikacji wypisuje dane wyjściowe w tym samym czasie, bez wskazania, z której aplikacji pochodzą dane wyjściowe. (To samo dotyczy wielu równoczesnych żądań w obrębie nawet tej samej aplikacji.)

Jak wspomniano, zastosowanie odpowiedniej struktury rejestrowania wyeliminuje oba te problemy.

0

Jeszcze jeden punkt, cokolwiek napisane z sysout będzie tam w czasie wykonywania, nie można go kontrolować, będzie drukować zawsze. Za pomocą struktury rejestrowania można włączyć/wyłączyć rejestrowanie.