code: public V setValue(V value) {
              if (value == null) throw new NullPointerException();
              V v = val;
              val = value;
              map.put(key, value);
              return v;
          }
docs: Sets our entry's value and writes through to the map. The
  value to return is somewhat arbitrary here. Since we do not
  necessarily track asynchronous changes, the most recent
  "previous" value could be different from what we return (or
  could even have been removed, in which case the put will
  re-establish). We do not and cannot guarantee more.