code: public V putIfDifferent( final K key, final V value ) {
          synchronized ( _map ) {
              final ManagedItem<V> item = _map.get( key );
              if ( item == null || item._value == null || !item._value.equals( value ) ) {
                  return put( key, value );
              } else {
                  return item._value;
              }
          }
      }
docs: If the specified key is not already associated with a value or if it's
  associated with a different value, associate it with the given value.
  This is equivalent to
  
  <pre>
  <code> if (map.get(key) == null || !map.get(key).equals(value))
  return map.put(key, value);
  else
  return map.get(key);
  </code>
  </pre>
  
  except that the action is performed atomically.
  
  @param key
  the key to associate the value with.
  @param value
  the value to associate with the provided key.
  @return the previous value associated with the specified key, or null if
  there was no mapping for the key