是java.util.UUID线程安全吗?

由于以下观察,我问这个问题

  1. 在高度multithreading环境中的线程转储中获取此堆栈跟踪

    "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  (a java.security.SecureRandom) at java.util.UUID.randomUUID(UUID.java:162) 
  2. 找到了这个链接

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

如果UUID不是线程安全的,请建议任何其他库(如果存在)。

UUID是不可变的,因此它可能是线程安全的,但显然在某些访问器中存在一些恶意缓存,这使得它不安全(现在修复了这个bug)。

但是你的线程转储只是说一个线程正在等待SecureRandom.nextBytes的锁定,这是由UUID.randomUUID工厂使用的,它肯定线程安全的。 据我所知,当多个线程同时调用它时,应该会发生这种情况。

Uuid是线程安全的,但是有另一个名为JUG的库,它在性能上更有效。

资料来源: http : //www.dcalabresi.com/blog/java/generate-java-uuid-performance/

这是线程安全的 – 这就是为什么我花了几周的时间来找到这个邪恶的类在并发程序中导致的瓶颈。