private void processMapChange(final Runnable changeAction) {
        lock.lock();
        try {
            changeAction.run();
            if (!mapChangeRequested && !isDestroyed.get()) {
                mapChangeRequested = true;
                changeExecutor.runMapChanges(mapChangeRunner);
            }
        } finally {
            lock.unlock();
        }
    }
replaces objects in this Map completely with given objects
<br>
Same effect could be reached by calling removeAll() followed by add(newObjects),
but performance is better when calling replace() method instead
main/src/main/java/cgeo/geocaching/utils/AsynchronousMapWrapper.java