2009-02-26 12 views
10

Jeśli w systemie działa wiele aplikacji Java, czy każdy identyfikator wątku jest unikalny względem wszystkich innych wątków Java, niezależnie od tego, z jakiej aplikacji są one uruchamiane?Pytanie dotyczące unikalności globalnej Thread.getId()

Aplikacje Java mają być pisane piaskownicą w porównaniu do innych aplikacji Java, więc pomyślałem, że może dojść do kolizji wątków ID.

Jeśli identyfikatory wątków są unikalne we wszystkich aplikacjach, czy to nie spowoduje wycieku niektórych (choć bardzo niewielkich) informacji o innych aplikacjach w systemie? Takich jak liczba wątków uruchomionych w innych aplikacjach lub nawet, jeśli w ogóle działają inne aplikacje Java?

+1

miałbym chyba F3 do metod w Eclipse przed opublikowaniem ... –

Odpowiedz

21

Pozwól mi sprawdzić źródło.

W init metodzie Thread „s (który nazywany jest przez każdego konstruktora):

/* Set thread ID */ 
tid = nextThreadID(); 

W nextThreadID():

private static synchronized long nextThreadID() { 
    return ++threadSeqNumber; 
} 

I:

/* For generating thread ID */ 
private static long threadSeqNumber; 

To nigdy nie jest ustawiony , a więc domyślnie wynosi 0.

Najwyraźniej numery identyfikatorów wątków zawsze zaczynają się od 0, a inkrement o 1. Innymi słowy, odpowiedź na pytanie brzmi, że są one unikatowe na całym świecie jako , a nie.

7

Według źródła JDK identyfikator wątku jest unikalny w danej maszynie JVM - w rzeczywistości jest po prostu implementowany jako działająca sekwencja.

Oto metoda nextThreadID() z 1.6.0_10:

private static synchronized long nextThreadID() { 
    return ++threadSeqNumber; 
} 

(tam chyba rzeczywiście długa przelewowy bug tam, prawdopodobnie nigdy nie jest faktycznie stało)

+0

Tak, myślę, że jest mało prawdopodobne, aby jakikolwiek istniejący system mógł uruchomić wątki 9223372036854775807. :) –

+0

Nie trzeba ich uruchamiać jednocześnie ... Załóżmy, że istnieje system, który tworzy co sekundę nowy wątek (oczywiście powinno to być łączenie wątków, ale załóżmy, że tak nie jest). To tylko 292471208677 lat ciągłego biegu : P – Jared

+0

Tarło nowego wątku co milisekundę zajęłoby 292 277,66 milenia przepełnienia. –

Powiązane problemy