我希望将timestamp
中的当前AtomicLong
与currentTimeMS
进行比较,以便我知道是否已经过了一段时间,如果是,那么只有一个线程会输入一段代码但是从我所看到的compareAndSet
仅比较特定值,如果值大于或小于另一个值,则不可能compareAndSet
。那可能吗?
if (myAtomicLong.compareAndSet(larger than last atomic long value + 10 seconds,
System.currentTimeMillis() + 10 seconds)) {
// one thread enters here only as only one thread saw that current myAtomicLong
// was larger than last timestamp recorded + 10 seconds.
// and if yes immediately set the value to next 10 seconds.
// do some work
}
答案 0 :(得分:1)
您应该使用ScheduledExecutorService
。
原因很简单:System.currentTimeMillis()
并不像你想象的那么可靠......如果操作系统时间改变,它的值会改变;而ScheduledExecutorService
的实现使用System.nanoTime()
,这是一个从JVM开始运行并且总是会增加的自动收报机。
请注意Timer
和TimerTask
遇到同样的问题!