我有一个组件,其中线程轮询某些资源和System.currentTimeMillis()
;如果没有资源,则转到Object.wait(1)
,因为我知道我将等待至少1 ms(当线程看到新的时间戳时,资源会被补充)。但是,在JVM中Object.wait()
会导致ObjectMonitor::TrySpin_VaryDuration
,因此当我告诉它去睡觉时,线程正在烧CPU。
有没有办法解决它(更好的同步原语与类似的semanthics?)但重新设计组件,以便线程无限制地休眠,只有一个线程忙于等待?或者我可以选择性地在这个对象上禁用它吗?
编辑:我的问题有点傻。我应该使用Thread.sleep(1)
作为接受的答案说(除非使用自旋锁,否则还没有确认),因为当它等待线程时,没有必要唤醒等待的线程。因为他们应该已经超时醒来了。
答案 0 :(得分:3)
Object.wait(1)
是错误的工具。请改用Thread.sleep(1)
。
答案 1 :(得分:0)
您可以尝试使用名为-XX:-UseSpinning