2012-05-02 11 views
5

Kiedy miałem do czynienia z koncepcją wątków w Javie, widziałem plik źródłowy Thread.java. Zauważyłem, że metoda setName() przypisuje ciąg do tablicy znaków o nazwie "name[]". Java ma funkcję typu danych String, a następnie dlaczego używa tablicy znaków.dlaczego setName w klasie Thread przypisuje do tablicy znaków? Dlaczego nie ciąg?

W pliku źródłowym jest inicjowany jak,

private char name[]; // why not "private String name;" 

W setName() metodzie

public final void setName(String name) { 
    checkAccess(); 
    this.name = name.toCharArray(); 
    } 

Proszę mi pomóc. Z góry dziękuję.

Odpowiedz

9

Dostęp do tej nazwy jest możliwy z kodu macierzystego, dlatego łatwiej jest posługiwać się tablicami znaków niż kostką z typami Java. Lista dyskusyjna core-lib-devs omawiała to pytanie jakiś czas temu, tutaj jest link dla jednej wiadomości z wątku. Pierwotne pytanie stwierdziło, że "" sporo czasu trafia do tego wywołania Thread.setName, które moim zdaniem znaczącą częścią jest wykonanie nowej alokacji i skopiowania tablicy char itp. ". Cytując fragmenty odpowiedź:

Wystąpił RFE tej drodze powrotnej pod koniec 2002 roku:

4745629 (gwint) Thread.setName robi przydziały nieproduktywny strunowe (nie używać char [])

początkowy eval w 2002 roku stwierdził:

„nie mogę sobie wyobrazić, że to poważnie wpływa na wydajność każdej realnego programu Ponadto, zmiana pola w wątku jest problematyczne ze względu na ścisły związek. statek tej klasy z VM. Powiedział, że być może warto zajęcie to w kontekście jakiegoś Thread code-czyszczenia „

Następnie w 2005 roku został zamknięty jako«nie będzie naprawić.»:

” Istnieją Zależności dotyczące nazwy reprezentacja jest tablica char w JVM i to RFE należy szacunkiem odrzucony „

+2

Czy możesz to potwierdzić z jakimś odnośnikiem? Nic nie widzę w "Thread.java" lub "Thread.c' (w drzewie" rodzimym "), dzięki czemu nazwa jest dostępna dla natywnego kodu. Jeśli byłby dostępny z natywnego kodu, spodziewałbym się, że na końcu pojawi się znak zerowy. Wydaje się to być spekulacją. –

+0

To była świetna odpowiedź, dziękuję. Czy mogę wziąć pod uwagę, że jest to jeden z powodów, dla których java nie jest językiem czysto obiektowym? – kik

+1

@kik: ** cały ** "jest językiem Java czystym językiem OO" pytanie ** jest bezużyteczne **, ponieważ nikt, kto kiedykolwiek go zapytał, nie był w stanie dostarczyć użytecznej definicji tego, co dokładnie czyni "czysty język OO". Bardzo bym chciał, aby mi udowodniono, że się mylę, ale do tej pory tak się nie stało. –

4

myślę, że jest to najprawdopodobniej historyczny artefakt, tzn. coś, co zostało zrobione dawno temu z powodów, które nie są już

Jak wskazuje komentarz Curtisku, zasugerowano, aby to naprawić. Ale brzmi to tak, jakby pomysły zostały ustalone z jednej strony, ponieważ wysiłek, aby naprawić, przekracza korzyści. I jest całkiem jasne, że korzyści z naprawienia tej anomalii są znikome ... chyba że tworzysz wiele wątków, które wykonują mało prawdziwą pracę.

RWE (4745629) nie jest już widoczny w Google, ale this mailing list posting przez Davida Holmesa @ Oracle odnosi się do niego:

Xiaobin Lu powiedział, że opierając się na 08/11/10 08:07:

Dzięki za odpowiedź. W przypadku wielu aplikacji dla przedsiębiorstw (takich jak , dla których pracuję), znaczna ilość czasu trafia do tego wątku.setName zadzwoń pod numer , który moim zdaniem znaczącą częścią jest nowa alokacja znaków i kopia tablicy kolorów itp. Więc myślę, że powinniśmy zastanowić się jeszcze raz nad tym, jak możemy efektywnie przechowywać to pole.

Wystąpił RFE tej drodze powrotnej pod koniec 2002 roku:

4745629 (gwint) Thread.setName robi zbędnych alokacje sznurek (nie użytkowania char [])

Początkowy eval w roku 2002 stwierdził:

"Nie mogę sobie wyobrazić, że ma to poważny wpływ na działanie każdego realnego programu . Ponadto zmiana pól w wątku jest problematyczna z powodu do ścisłego związku tej klasy z t on VM. Powiedział, że może to warto zajęcie to w kontekście jakiegoś wątku code-czyszczenia „

Następnie w 2005 roku został zamknięty jako«nie będzie naprawić.»:

” Istnieją zależności na reprezentację i nazwisko jest tablica char w JVM i to RFE należy szacunkiem odrzucone.”


Zmiana zarówno VM i kod Java jest, jak wiadomo, prawdziwy ból współrzędnych, więc nie będzie musiał być pewnym przekonującym dowodem na dowód sup portuj to (zakładając, że można to zmienić). Osobiście zgadzam się z pierwszym evalem powyżej - jeśli setName ma wpływ na ogólną wydajność , to twoje wątki nie mogą wykonywać zbyt wiele prawdziwej pracy i wydaje się, że tworzysz zbyt wiele wątków - więc byłbym zainteresowany zainteresowanym tutaj więcej o kontekście, w którym to występuje.

Powiązane problemy