由于以下观察,我问这个问题
在高度多线程环境中的线程转储中获取此堆栈跟踪
"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)
找到了这个链接
如果UUID不是线程安全的,请建议任何其他库(如果存在)。
答案 0 :(得分:13)
UUID是不可变的,所以它可能是线程安全的,但显然在某些访问器中有一些evil caching going on使它不安全(现在修复了这个bug)。
但是你的线程转储只是说一个线程正在等待SecureRandom.nextBytes
的锁定,UUID.randomUUID
工厂使用它,这肯定是 线程安全的。据我所知,当多个线程同时调用它时,应该会发生这种情况。
答案 1 :(得分:0)
Uuid是线程安全的,但还有另一个名为JUG的库 这在性能上更有效。
来源:http://www.dcalabresi.com/blog/java/generate-java-uuid-performance/