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 не является потокобезопасным, предложите любую другую библиотеку, если она существует.
Ответы
Ответ 1
UUID является неизменным, поэтому он потенциально может быть потокобезопасным, но, по-видимому, в некоторых аксессуарах произошел некоторый злое кэширование, что сделало его небезопасным (эта ошибка теперь фиксируется).
Но ваш дамп потока просто говорит, что поток ждет блокировки в SecureRandom.nextBytes
, который используется UUID.randomUUID
factory, который определенно является потокобезопасным. Это то, что должно было произойти, когда несколько потоков называют это одновременно, насколько я могу судить.
Ответ 2
Uuid является потокобезопасным, но есть еще одна библиотека под названием JUGкоторый более эффективен в производительности.
Источник: http://www.dcalabresi.com/blog/java/generate-java-uuid-performance/
Ответ 3
Он потокобезопасный. Вот почему я потратил несколько недель, чтобы найти узкое место, вызванное этим злым классом в параллельной программе.