web-dev-qa-db-ja.com

Java.util.UUIDスレッドは安全ですか?

私は次の観察のためにこの質問をしています

  1. 高度にマルチスレッド化された環境のスレッドダンプでこのスタックトレースを取得する

    "http-80-200" daemon prio=10 tid=0x00002aaab4981000 nid=0x7520 waiting \
     for monitor entry [0x000000004fec7000]
       Java.lang.Thread.State: BLOCKED (on object monitor)
        at Java.security.SecureRandom.nextBytes(SecureRandom.Java:433)
        - waiting to lock <0x00000000c00da220> (a Java.security.SecureRandom)
        at Java.util.UUID.randomUUID(UUID.Java:162)
    
  2. このリンクを見つけました

    http://bugs.Sun.com/view_bug.do?bug_id=66118

uUIDがスレッドセーフでない場合は、他のライブラリが存在する場合はそれを提案してください。

26

UUIDは不変であるため、スレッドセーフである可能性がありますが、一部のアクセサーでいくつかの 悪のキャッシュが進行中 であり、安全ではありませんでした(このバグは現在修正されています)。

しかし、スレッドダンプは、スレッドがSecureRandom.nextBytesでロックを待機していることを示しています。これは、UUID.randomUUIDファクトリによって使用されます。これは間違いなくisスレッドセーフ。私の知る限り、複数のスレッドが同時にそれを呼び出すと、それが起こるはずです。

14
Joonas Pulakka

Uuidはスレッドセーフですが、 [〜#〜] jug [〜#〜] という別のライブラリがあり、パフォーマンスがより効率的です。

ソース: http://www.dcalabresi.com/blog/Java/generate-Java-uuid-performance/

0