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

java.util.UUID是线程安全的吗?,java,multithreading,thread-safety,Java,Multithreading,Thread Safety,我提出这个问题是因为以下观察结果 在高度多线程环境中的线程转储中获取此堆栈跟踪 “http-80-200”守护程序prio=10 tid=0x00002aab498100 nid=0x7520等待\ 用于监视器条目[0x000000004fec7000] java.lang.Thread.State:阻塞(在对象监视器上) 位于java.security.SecureRandom.nextBytes(SecureRandom.java:433) -等待锁定(java.security.Secur

我提出这个问题是因为以下观察结果

  • 在高度多线程环境中的线程转储中获取此堆栈跟踪

    “http-80-200”守护程序prio=10 tid=0x00002aab498100 nid=0x7520等待\
    用于监视器条目[0x000000004fec7000]
    java.lang.Thread.State:阻塞(在对象监视器上)
    位于java.security.SecureRandom.nextBytes(SecureRandom.java:433)
    -等待锁定(java.security.SecureRandom)
    在java.util.UUID.randomUUID(UUID.java:162)
    
  • 找到这个链接


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

    UUID是不可变的,因此它可能是线程安全的,但显然某些访问器中存在一些使其不安全的漏洞(该漏洞现在已修复)

    但是您的线程转储只是说线程正在等待
    SecureRandom.nextBytes
    上的锁,该锁由
    UUID.randomuid
    工厂使用,它绝对是线程安全的。据我所知,这是当几个线程同时调用它时应该发生的事情

    Uuid是线程安全的,但是还有另一个库称为 哪个在性能上更有效


    来源:

    线程处于
    阻塞状态这一事实本身并不意味着存在问题。如果线程正在等待获取同步方法或代码块的锁,这是正常的。只有当线程永远处于这种状态时,可能意味着链接存在死锁。+1(Josh Bloch的错误报告…)-顺便说一句,在错误报告()中链接的错误现在应该得到修复。在某些情况下,使用SecureRandom会使此方法非常慢。如果你真的想要最好的比特,使用这个比特源是很好的,但是如果你想要很多UUID(也许是为了模拟),这可能是灾难性的慢。因为这个错误在几年前就被修复了,这个答案应该说它现在是线程安全的吗?