Saturday, September 12, 2015

Monotonically increasing time



http://vanillajava.blogspot.ro/2010/06/monotonically-increasing-time.html
http://grepcode.com/file_/repo1.maven.org/maven2/org.codehaus.btm/btm/2.1.4/bitronix/tm/utils/MonotonicClock.java
There are times you need to have a simple monotonicly increasing clock for timestamps but one which doesn't drift too far from the system time.
public enum Time {; 
    private static final AtomicLong lastTime = new AtomicLong(); 
    public static long increasingTimeMillis() { 
        long now = System.currentTimeMillis(); 
        long time = lastTime.getAndIncrement(); 
        if (now > time) { 
            lastTime.compareAndSet(time+1, now);
            return lastTime.getAndIncrement();  
        } 
        return time; 
    } 
} 
http://www.zynaptic.com/reaction/userguide/node14.html
https://dzone.com/articles/logical-vs-physical-clock
Java has two ways of fetching the current system time. You can either use:
  1. System#currentTimeMillis(), that gives you the number of milliseconds elapsed since Unix epoch
    This method doesn’t give you monotonic time results because it returns the wall clock time which is prone to both forward and backward adjustments (if NTP is used for system time synchronization).
    For monotonic currentTimeMillis, you can check Peter Lawrey’s solutionor Bitronix Transaction Manager Monotonic Clock.
  2. System#nanoTime(), that returns the number of nanoseconds elapsed since an arbitrarily chosen time reference
  3. This method tries to use the current operating system monotonic clock implementation, but it falls back to wall clock time if no monotonic clock could be found.
Optimistic locking is all about event ordering, so naturally we’re only interested in the happened-before relationship.
In distributed computing, logical clocks are favored over physical ones (system clock), because networks time synchronization implies variable latencies.
Sequence number versioning is similar to Lamport timestamps algorithm, each event incrementing only one counter.
While Lamport timestamps was defined for multiple distributed nodes event synchronization, database optimistic locking is much simpler, because there is only on node (the database server) where all transactions are synchronized (coming from concurrent client connections).
Argument 4: Distributed computing favors logical clock over physical ones, because we are only interested in event ordering anyway.


Labels

Review (572) System Design (334) System Design - Review (198) Java (189) Coding (75) Interview-System Design (65) Interview (63) Book Notes (59) Coding - Review (59) to-do (45) Linux (43) Knowledge (39) Interview-Java (35) Knowledge - Review (32) Database (31) Design Patterns (31) Big Data (29) Product Architecture (28) MultiThread (27) Soft Skills (27) Concurrency (26) Cracking Code Interview (26) Miscs (25) Distributed (24) OOD Design (24) Google (23) Career (22) Interview - Review (21) Java - Code (21) Operating System (21) Interview Q&A (20) System Design - Practice (20) Tips (19) Algorithm (17) Company - Facebook (17) Security (17) How to Ace Interview (16) Brain Teaser (14) Linux - Shell (14) Redis (14) Testing (14) Tools (14) Code Quality (13) Search (13) Spark (13) Spring (13) Company - LinkedIn (12) How to (12) Interview-Database (12) Interview-Operating System (12) Solr (12) Architecture Principles (11) Resource (10) Amazon (9) Cache (9) Git (9) Interview - MultiThread (9) Scalability (9) Trouble Shooting (9) Web Dev (9) Architecture Model (8) Better Programmer (8) Cassandra (8) Company - Uber (8) Java67 (8) Math (8) OO Design principles (8) SOLID (8) Design (7) Interview Corner (7) JVM (7) Java Basics (7) Kafka (7) Mac (7) Machine Learning (7) NoSQL (7) C++ (6) Chrome (6) File System (6) Highscalability (6) How to Better (6) Network (6) Restful (6) CareerCup (5) Code Review (5) Hash (5) How to Interview (5) JDK Source Code (5) JavaScript (5) Leetcode (5) Must Known (5) Python (5)

Popular Posts