Thread.getId()グローバルな一意の質問
-
09-09-2019 - |
質問
複数のJavaアプリケーションがシステム上で実行されている場合は、
にかかわらず、それらが実行されているどのようなアプリケーションの、他のすべてのJavaスレッドの各スレッドID独特の相対的なのですか?
私はスレッドIDが衝突することは可能かもしれないと思ったので、Javaアプリケーションは、他のJavaアプリケーションへの砂箱入り相対することになっている。
スレッドIDは、すべてのアプリケーション間で一意である場合、それはシステム上の他のアプリケーションに関するいくつかの(ただし、非常にマイナーな)情報を漏洩しないのだろうか?このようなどのように多くのスレッドが他のアプリケーションで開始している、またはその他のJavaアプリケーションがまったく実行されている場合でも?
など解決
まあ、私はソースをチェックしてみましょう。
(すべてのコンストラクタによって呼び出される)Thread
のinit
方法において:
/* Set thread ID */
tid = nextThreadID();
nextThreadID()
でます:
private static synchronized long nextThreadID() {
return ++threadSeqNumber;
}
と
/* For generating thread ID */
private static long threadSeqNumber;
これは、0にこのようにデフォルト値を設定していない、と決してされます。
だから、明らかにいつもつまり1で0と増分で開始するID番号をスレッド、あなたの質問への答えは、彼らがのないのグローバルに一意であるということです。
他のヒント
JDKのソースによると、スレッドIDが指定されたJVM内で一意である - 。実際には、それは単に、実行中のシーケンスとして実装されています。
ここで1.6.0_10からnextThreadID()メソッドです
private static synchronized long nextThreadID() {
return ++threadSeqNumber;
}
(そこに長いオーバーフローのバグが実際におそらくあります、おそらくそれが実際に起こったことがないです)。
所属していません StackOverflow