Подтвердить что ты не робот

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)
    
  • нашел эту ссылку

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

Если UUID не является потокобезопасным, предложите любую другую библиотеку, если она существует.

4b9b3361

Ответ 1

UUID является неизменным, поэтому он потенциально может быть потокобезопасным, но, по-видимому, в некоторых аксессуарах произошел некоторый злое кэширование, что сделало его небезопасным (эта ошибка теперь фиксируется).

Но ваш дамп потока просто говорит, что поток ждет блокировки в SecureRandom.nextBytes, который используется UUID.randomUUID factory, который определенно является потокобезопасным. Это то, что должно было произойти, когда несколько потоков называют это одновременно, насколько я могу судить.

Ответ 3

Он потокобезопасный. Вот почему я потратил несколько недель, чтобы найти узкое место, вызванное этим злым классом в параллельной программе.