java.util.UUID thread 是安全的吗?

2022-09-01 14:45:54

我问这个问题是因为以下观察

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

    "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)
    
  2. 找到此链接

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

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


答案 1

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

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


答案 2