我问这个问题是因为以下观察
-
在高度多线程环境中的线程转储中获取此堆栈跟踪
"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)
-
找到这个链接
https://bugs.java.com/bugdatabase/view_bug?bug_id=6611830 https://bugs.java.com/bugdatabase/view_bug?bug_id=6611830
如果 UUID 不是线程安全的,请建议任何其他库(如果存在)。
UUID 是不可变的,因此它可能是线程安全的,但显然有一些邪恶的缓存正在进行 https://bugs.java.com/bugdatabase/view_bug.do?bug_id=6611830在一些使其不安全的访问器中(该错误现已修复)。
但是你的线程转储只是说一个线程正在等待锁定SecureRandom.nextBytes
,这是由UUID.randomUUID
工厂,这绝对是is线程安全。据我所知,当多个线程同时调用它时,应该会发生这种情况。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)