diff --git a/src/main/java/net/openhft/chronicle/hash/ChronicleHashBuilder.java b/src/main/java/net/openhft/chronicle/hash/ChronicleHashBuilder.java index 74de5104c..f8be74da6 100755 --- a/src/main/java/net/openhft/chronicle/hash/ChronicleHashBuilder.java +++ b/src/main/java/net/openhft/chronicle/hash/ChronicleHashBuilder.java @@ -396,7 +396,7 @@ public interface ChronicleHashBuilder, * replication consensus protocol (conflicting data updates resolution). * *

Default time provider uses system time ({@link System#currentTimeMillis()}) in - * nanosecond precision. + * nanosecond precision, also it returns non-decreasing time. * * @param timeProvider a new time provider for replication needs * @return this builder back diff --git a/src/main/java/net/openhft/chronicle/map/NanosecondPrecisionSystemTimeProvider.java b/src/main/java/net/openhft/chronicle/map/NanosecondPrecisionSystemTimeProvider.java index 0dab2e3f8..3d945a9aa 100644 --- a/src/main/java/net/openhft/chronicle/map/NanosecondPrecisionSystemTimeProvider.java +++ b/src/main/java/net/openhft/chronicle/map/NanosecondPrecisionSystemTimeProvider.java @@ -20,6 +20,7 @@ import net.openhft.chronicle.hash.replication.TimeProvider; import java.io.ObjectStreamException; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicLong; import static java.util.concurrent.TimeUnit.NANOSECONDS; import static java.util.concurrent.TimeUnit.MILLISECONDS; @@ -27,6 +28,8 @@ import static java.util.concurrent.TimeUnit.MILLISECONDS; final class NanosecondPrecisionSystemTimeProvider extends TimeProvider { private static final long serialVersionUID = 0L; + private static final AtomicLong lastTimeHolder = new AtomicLong(); + private static final NanosecondPrecisionSystemTimeProvider INSTANCE = new NanosecondPrecisionSystemTimeProvider(); @@ -38,7 +41,14 @@ final class NanosecondPrecisionSystemTimeProvider extends TimeProvider { @Override public long currentTime() { - return MILLISECONDS.toNanos(System.currentTimeMillis()); + long now = MILLISECONDS.toNanos(System.currentTimeMillis()); + while (true) { + long lastTime = lastTimeHolder.get(); + if (now <= lastTime) + return lastTime; + if (lastTimeHolder.compareAndSet(lastTime, now)) + return now; + } } @Override