- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
spring-data-redis
模块包含 RedisAtomicLong
类。
在这个类中你可以看到
public boolean compareAndSet(long expect, long update) {
return generalOps.execute(new SessionCallback<Boolean>() {
@Override
@SuppressWarnings("unchecked")
public Boolean execute(RedisOperations operations) {
for (;;) {
operations.watch(Collections.singleton(key));
if (expect == get()) {
generalOps.multi();
set(update);
if (operations.exec() != null) {
return true;
}
}
{
return false;
}
}
}
});
}
我的问题是它为什么有效?
generalOps.multi()
在调用 get()
后开始事务。这意味着有可能两个不同的线程(甚至客户端)可以更改值并且它们都将成功。
operations.watch
是否以某种方式阻止了它? JavaDoc 没有解释此方法的用途。
PS:小问题:为什么 for (;;)
?总是有一个迭代。
最佳答案
问:operations.watch 是否以某种方式阻止它?
是。
引自Redis documentation about transaction :
WATCH is used to provide a check-and-set (CAS) behavior to Redis transactions.
WATCHed keys are monitored in order to detect changes against them. If at least one watched key is modified before the EXEC command, the whole transaction aborts, and EXEC returns a Null reply to notify that the transaction failed.
您可以从该文档中了解有关 Redis 事务的更多信息。
问:为什么要 (;;)?总是有一个迭代。
您发布的代码似乎很旧。来自 Google 的缓存 this url ,我看到你提供的代码可以追溯到 2012 年 10 月 15 日
!
最新的代码看起来很不一样:
关于java - compareAndSet 如何在 Redis 内部工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54234192/
Java 通过其原子类公开 CAS 操作,例如 boolean compareAndSet(expected,update) JavaDocs指定 compareAndSet 操作的内存效果如下: c
假设您有以下类(class) public class AccessStatistics { private final int noPages, noErrors; public Acces
正在学习并发编程类(class)。 举个例子 final class Counter { private AtomicInteger value; public lon
我想知道原子类中 set() 和 compareAndSet() 的区别。 set() 方法是否也保证了原子过程?例如这段代码: public class sampleAtomic{ priv
今天我在采访中被问到下一个问题:“如果您在处理器不支持 CAS 操作的机器上调用 AtomicLong 的 compareAndSet 方法,会发生什么情况”。 能否请您帮我解决这个问题,并在可能的情
我正在实现一个简单的缓存,并将缓存存储为 AtomicReference。 private AtomicReference> cacheData; 应该从数据库表中(延迟地)填充缓存对象。 我提供了一
我正在试验 java.util.concurrent 并试图找出如何正确使用 AtomicReference.compareAndSet 来管理对单个共享状态单元的并发访问。 特别是:compareA
spring-data-redis 模块包含 RedisAtomicLong 类。 在这个类中你可以看到 public boolean compareAndSet(long expect, long
From the Java AtomicReferenceFieldUpdater docs : Note that the guarantees of the compareAndSet metho
源码是一样的。 public final boolean compareAndSet(V expect, V update) { return unsafe.compareAndSwapObj
在阅读 Java 中 java.util.Random 类的文档时,我偶然发现了 next 方法中的一些东西,我无法完全理解。 protected int next(int bits) { l
Java 的 AtomicInteger 提供 public final boolean compareAndSet(int expect, int update) .如果返回false,我想知道比较
线程标题应该是不言自明的......我对 AtomicBoolean 类的以下方法的规范有点困惑: java.util.concurrent.atomic.AtomicBoolean#compareA
我希望将 AtomicLong 中的当前 timestamp 与 currentTimeMS 进行比较,以便我知道是否已经过去了一段时间,如果是,则只有一个单线程将进入一个代码块,但据我所知,comp
来自AtomicLong的源代码: public final boolean compareAndSet(long expect, long update) { return
因为 Atomic 意味着线程安全。当 .set() 本身在 Java 中是原子和线程安全的时,我们什么时候使用 compareAndSet? 举例来说,我想自动设置一个变量,这样每个其他线程都可以看
static boolean unsynchronizedSetter(Date expected){ Date newDate = new Date(); AtomicReferen
VarHandle 显示以下错误 - Exception in thread "main" java.lang.NoSuchMethodError: VarHandle.compareAndSet(V
我正在实现一个请求实例的 FIFO 队列(为速度而预先分配的请求对象),并开始使用 add 方法上的“同步”关键字。该方法很短(检查固定大小缓冲区中是否有空间,然后将值添加到数组)。使用visualV
我想知道调用之间是否有任何区别(或可能的副作用): AtomicBoolean.set(true) 和 AtomicBoolean.compareAndset(false, true) AtomicB
我是一名优秀的程序员,十分优秀!