class ConcurrentTreeMap<K, V> extends TreeMap<K, V> {

    private final ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();

    public ConcurrentTreeMap() {
        super();
    }

    @Override
    public V put(K key, V value) {<FILL_FUNCTION_BODY>}

    @Override
    public V remove(Object key) {
        readWriteLock.writeLock().lock();
        try {
            return super.remove(key);
        } finally {
            readWriteLock.writeLock().unlock();
        }
    }

    @Override
    public Map.Entry<K, V> firstEntry() {
        readWriteLock.readLock().lock();
        try {
            return super.firstEntry();
        } finally {
            readWriteLock.readLock().unlock();
        }
    }

    @Override
    public Map.Entry<K, V> higherEntry(K key) {
        readWriteLock.readLock().lock();
        try {
            return super.higherEntry(key);
        } finally {
            readWriteLock.readLock().unlock();
        }
    }

    @Override
    public Map.Entry<K, V> ceilingEntry(K key) {
        readWriteLock.readLock().lock();
        try {
            return super.ceilingEntry(key);
        } finally {
            readWriteLock.readLock().unlock();
        }
    }
}

        readWriteLock.writeLock().lock();
        try {
            return super.put(key, value);
        } finally {
            readWriteLock.writeLock().unlock();
        }
    
<methods>public void <init>() ,public void <init>(Comparator<? super K>) ,public void <init>(Map<? extends K,? extends V>) ,public void <init>(SortedMap<K,? extends V>) ,public Entry<K,V> ceilingEntry(K) ,public K ceilingKey(K) ,public void clear() ,public java.lang.Object clone() ,public Comparator<? super K> comparator() ,public V compute(K, BiFunction<? super K,? super V,? extends V>) ,public V computeIfAbsent(K, Function<? super K,? extends V>) ,public V computeIfPresent(K, BiFunction<? super K,? super V,? extends V>) ,public boolean containsKey(java.lang.Object) ,public boolean containsValue(java.lang.Object) ,public NavigableSet<K> descendingKeySet() ,public NavigableMap<K,V> descendingMap() ,public Set<Entry<K,V>> entrySet() ,public Entry<K,V> firstEntry() ,public K firstKey() ,public Entry<K,V> floorEntry(K) ,public K floorKey(K) ,public void forEach(BiConsumer<? super K,? super V>) ,public V get(java.lang.Object) ,public SortedMap<K,V> headMap(K) ,public NavigableMap<K,V> headMap(K, boolean) ,public Entry<K,V> higherEntry(K) ,public K higherKey(K) ,public Set<K> keySet() ,public Entry<K,V> lastEntry() ,public K lastKey() ,public Entry<K,V> lowerEntry(K) ,public K lowerKey(K) ,public V merge(K, V, BiFunction<? super V,? super V,? extends V>) ,public NavigableSet<K> navigableKeySet() ,public Entry<K,V> pollFirstEntry() ,public Entry<K,V> pollLastEntry() ,public V put(K, V) ,public void putAll(Map<? extends K,? extends V>) ,public V putIfAbsent(K, V) ,public V remove(java.lang.Object) ,public V replace(K, V) ,public boolean replace(K, V, V) ,public void replaceAll(BiFunction<? super K,? super V,? extends V>) ,public int size() ,public SortedMap<K,V> subMap(K, K) ,public NavigableMap<K,V> subMap(K, boolean, K, boolean) ,public SortedMap<K,V> tailMap(K) ,public NavigableMap<K,V> tailMap(K, boolean) ,public Collection<V> values() <variables>private static final boolean BLACK,private static final boolean RED,private static final java.lang.Object UNBOUNDED,private final Comparator<? super K> comparator,private transient NavigableMap<K,V> descendingMap,private transient EntrySet entrySet,private transient int modCount,private transient KeySet<K> navigableKeySet,private transient Entry<K,V> root,private static final long serialVersionUID,private transient int size