Tricker than I like: In Java, how do you keep a map with the values being the "most recent timestamp" for the key? How do you do this for a concurrent map with multiple threads updating?
boolean isLatest(final K key, final long newTimestamp, final ConcurrentMap<K, Long> map) { Long oldTimestamp = map.putIfAbsent(key, newTimestamp); // If we are first, there is no previous to compare // with if (null == oldTimestamp) return true; // Make sure we are still the most recent while (newTimestamp > oldTimestamp) { if (map.replace(key, oldTimestamp, newTimestamp)) // No other thread has updated, we are most // recent return true; // Another thread got here first, recheck oldTimestamp = map.get(key); } // Another thread put in a newer update, we are not // most recent return false; }
As with all multi-threaded coding, bugs are easy to make and hard to spot. If I have made one, please let me know!
UPDATE: Fixed a typo. Thanks, David!