diff --git a/src/main/java/org/redisson/RedissonAtomicLong.java b/src/main/java/org/redisson/RedissonAtomicLong.java index 0260cec10..4af2db05e 100644 --- a/src/main/java/org/redisson/RedissonAtomicLong.java +++ b/src/main/java/org/redisson/RedissonAtomicLong.java @@ -96,14 +96,27 @@ public class RedissonAtomicLong extends RedissonExpirable implements RAtomicLong } @Override - public long getAndAdd(long delta) { - while (true) { - // TODO optimize - long current = get(); - long next = current + delta; - if (compareAndSet(current, next)) - return current; - } + public long getAndAdd(final long delta) { + return connectionManager.write(new SyncOperation() { + @Override + public Long execute(RedisConnection conn) { + while (true) { + conn.watch(getName()); + + Number n = (Number) conn.get(getName()); + Long value = 0L; + if (n != null) { + value = n.longValue(); + } + + conn.multi(); + conn.set(getName(), value + delta); + if (conn.exec().size() == 1) { + return value; + } + } + } + }); } @Override