@@ -371,6 +371,12 @@ protected Boolean execute(@Nullable Reference<K, V> ref, @Nullable Entry<K, V> e
371371
372372 @ Override
373373 public @ Nullable V computeIfAbsent (@ Nullable K key , Function <@ Nullable ? super K , @ Nullable ? extends V > mappingFunction ) {
374+ // avoid locking if entry is present
375+ Reference <K , V > ref = getReference (key , Restructure .NEVER );
376+ Entry <K , V > entry = (ref != null ? ref .get () : null );
377+ if (entry != null ) {
378+ return entry .getValue ();
379+ }
374380 return doTask (key , new Task <V >(TaskOption .RESTRUCTURE_BEFORE , TaskOption .RESIZE ) {
375381 @ Override
376382 protected @ Nullable V execute (@ Nullable Reference <K , V > ref , @ Nullable Entry <K , V > entry , @ Nullable Entries <V > entries ) {
@@ -390,6 +396,12 @@ protected Boolean execute(@Nullable Reference<K, V> ref, @Nullable Entry<K, V> e
390396
391397 @ Override
392398 public @ Nullable V computeIfPresent (@ Nullable K key , BiFunction <@ Nullable ? super K , @ Nullable ? super V , @ Nullable ? extends V > remappingFunction ) {
399+ // avoid locking if entry is absent
400+ Reference <K , V > ref = getReference (key , Restructure .NEVER );
401+ Entry <K , V > entry = (ref != null ? ref .get () : null );
402+ if (entry == null ) {
403+ return null ;
404+ }
393405 return doTask (key , new Task <V >(TaskOption .RESTRUCTURE_BEFORE , TaskOption .RESIZE ) {
394406 @ Override
395407 protected @ Nullable V execute (@ Nullable Reference <K , V > ref , @ Nullable Entry <K , V > entry , @ Nullable Entries <V > entries ) {
0 commit comments