diff --git a/src/main/java/org/redisson/RedissonAtomicLong.java b/src/main/java/org/redisson/RedissonAtomicLong.java index 785596c9b..0260cec10 100644 --- a/src/main/java/org/redisson/RedissonAtomicLong.java +++ b/src/main/java/org/redisson/RedissonAtomicLong.java @@ -35,17 +35,6 @@ public class RedissonAtomicLong extends RedissonExpirable implements RAtomicLong protected RedissonAtomicLong(ConnectionManager connectionManager, String name) { super(connectionManager, name); - - init(); - } - - private void init() { - connectionManager.writeAsync(new ResultOperation() { - @Override - protected Future execute(RedisAsyncConnection async) { - return async.setnx(getName(), 0); - } - }); } @Override @@ -65,11 +54,22 @@ public class RedissonAtomicLong extends RedissonExpirable implements RAtomicLong public Boolean execute(RedisConnection conn) { while (true) { conn.watch(getName()); - Long value = ((Number) conn.get(getName())).longValue(); - if (value != expect) { + + Number n = (Number) conn.get(getName()); + Long value = null; + if (n != null) { + value = n.longValue(); + } + if (value == null) { + if (expect != 0) { + conn.unwatch(); + return false; + } + } else if (value != expect) { conn.unwatch(); return false; } + conn.multi(); conn.set(getName(), update); if (conn.exec().size() == 1) { @@ -92,18 +92,13 @@ public class RedissonAtomicLong extends RedissonExpirable implements RAtomicLong @Override public long get() { - Number res = connectionManager.read(new ResultOperation() { - @Override - protected Future execute(RedisAsyncConnection async) { - return async.get(getName()); - } - }); - return res.longValue(); + return addAndGet(0); } @Override public long getAndAdd(long delta) { while (true) { + // TODO optimize long current = get(); long next = current + delta; if (compareAndSet(current, next)) @@ -113,13 +108,26 @@ public class RedissonAtomicLong extends RedissonExpirable implements RAtomicLong @Override public long getAndSet(final long newValue) { - Number res = connectionManager.write(new ResultOperation() { + return connectionManager.write(new SyncOperation() { @Override - protected Future execute(RedisAsyncConnection async) { - return async.getset(getName(), newValue); + 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(), newValue); + if (conn.exec().size() == 1) { + return value; + } + } } }); - return res.longValue(); } @Override