java - atomicLong 如果 atomic long 大于某个数字,是否可以进行 compareAndSet?

标签 java multithreading scala

我希望将 AtomicLong 中的当前 timestampcurrentTimeMS 进行比较,以便我知道是否已经过去了一段时间,如果是,则只有一个单线程将进入一个代码块,但据我所知,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

}

最佳答案

您应该为此使用 ScheduledExecutorService

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

注意 TimerTimerTask 遇到同样的问题!

关于java - atomicLong 如果 atomic long 大于某个数字,是否可以进行 compareAndSet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22477194/

相关文章:

java - 在 Android 中加载大文本

multithreading - 线程因锁定的互斥锁而崩溃

java - 使用游戏框架中数据库中的值填充下拉列表

java - LDAP 搜索过滤器表达式实用程序或库

java - 如何保持写入文件的二进制数据的一致性?

java - 谁能解释 Windows (7 Pro N) 和 Linux ( Ubuntu 12-04) 之间的套接字吞吐量差异

scala - Shapeless:检查多态函数的类型约束

.net - 同步.net 4中的多个线程

C++(粒子光子)线程变化变量

scala - 在 Scala 中覆盖 val