question: @ Override final Node < K , V > find ( int h , Object k ) { if ( k != null ) { for ( Node < K , V > e = first ; e != null ; e = e . next ) { int s ; K ek ; if ( ( ( s = lockState ) & ( WAITER | WRITER ) ) != 0 ) { if ( e . hash == h && ( ( ek = e . key ) == k || ( ek != null && k . equals ( ek ) ) ) ) return e ; } else if ( U . compareAndSwapInt ( this , LOCKSTATE , s , s + READER ) ) { TreeNode < K , V > r , p ; try { p = ( ( r = root ) == null ? null : r . findTreeNode ( h , k , null ) ) ; } finally { Thread w ; int ls ; do { } while ( ! U . compareAndSwapInt ( this , LOCKSTATE , ls = lockState , ls - READER ) ) ; if ( ls == ( READER | WAITER ) && ( w = waiter ) != null ) LockSupport . unpark ( w ) ; } return p ; } } } return null ; }
target:  Returns matching node or null if none. Tries to search using tree comparisons from root, but continues linear search when lock not available.