2011-08-27 21 views
23

私は非常にマルチスレッド環境でスレッドダンプにはjava.util.UUIDスレッドセーフですか?

"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) 
  • をこのスタックトレースを取得するために、次の観測の

    1. この質問を求めていますが、このリンクに

      http://bugs.sun.com/view_bug.do?bug_id=6611830

    を見つけました

    UUIDがスレッドセーフでない場合は、他のライブラリがあればそれを示唆してください。

  • +2

    スレッドは、それ自体が、問題があることを意味するものではありません 'BLOCKED'状態であるという事実。スレッドが同期メソッドまたはコードブロックのロックを取得するのを待機している場合、これは正常です。スレッドがこの状態に永久に留まる場合に限り、デッドロックが発生する可能性があります。リンクのために – Jesper

    +0

    + 1(Josh Blochによるバグレポート...)、そしてバグレポート(http://cr.openjdk.java.net/~mduigou/6611830/webrev.0/webrev /)バグは今修正する必要があります –

    答えて

    10

    UUIDはスレッドセーフである可能性がありますが、一部のアクセサでは安全でない(このバグは修正されています)evil caching going onがあるようです。

    しかし、あなたのスレッドダンプだけスレッドは間違いスレッドセーフであるUUID.randomUUID工場で使用されSecureRandom.nextBytesでロック、待っていることを述べています。私が知る限り、複数のスレッドが同時に呼び出すときに起こるはずのことです。

    +0

    SecureRandomを使用すると、状況によってはこのメソッドが非常に遅くなります。本当に最高のビットが必要な場合はこのビットのソースを使用すると良いですが、(おそらくシミュレーション用に)多くのUUIDが必要な場合、これは悲惨に遅くなる可能性があります。 –

    +0

    バグは数年前に修正されていたため、これでスレッドセーフであると答えられるはずですか? – eis

    -1

    スレッドセーフ ---私は、この悪いクラスの結果であるボトルネックを並行プログラムで突き止めるのに何週間も費やしました。

    +0

    このボトルネックを回避するための回避策はありますか? – Ashish

    +7

    それはあなたがそれがスレッドセーフであるか、それともスレッドセーフではないと言っていますか?皮肉は本当にここで役に立たない。 – jtbradle

    +1

    あなたが本当にスレッドセーフであるかどうかについてはっきりと答えてください。あなたの忌まわしい答えから、あなたの答えの読者は何も保証されていません。 –

    関連する問題