I don't have an answer to your question but I can offer that the passivations counter code can be moved out of the synchronized block.
if (cache.getUseInterceptorMbeans()&& statsEnabled)
Of course, this code must still be located within the conditional expression
so moving it is probably only useful if you restructure the synchronization block.
The synchronization statement is needed to prevent multiple threads from trying to passivate or activate the node at the same time. However, we can switch to use BaseCacheLoaderInterceptor.obtainLoaderLock() to obtain locks. The same strategy used in CacheStoreInterceptor and CacheLoaderInterceptor. Please open a JIRA Issue for it and it'll be done.
I don't get how it was supposed to work, since if there were two evict calls, the two CacheLoader.put(Fqn, Map) calls would still happen, though serialized in some order. Is CacheLoader.put() externally synchronized? Maybe I misunderstood the code.