atomicLong是否可以做compareAndSet,如果原子长度大于某个数字?

时间:2014-03-18 10:53:33

标签: java multithreading scala

我希望将timestamp中的当前AtomicLongcurrentTimeMS进行比较,以便我知道是否已经过了一段时间,如果是,那么只有一个线程会输入一段代码但是从我所看到的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

}

1 个答案:

答案 0 :(得分:1)

您应该使用ScheduledExecutorService

原因很简单:System.currentTimeMillis()并不像你想象的那么可靠......如果操作系统时间改变,它的值会改变;而ScheduledExecutorService的实现使用System.nanoTime(),这是一个从JVM开始运行并且总是会增加的自动收报机。

请注意TimerTimerTask遇到同样的问题!