Правильным решением с точки зрения Vert.x будет использование SharedData.getLock()
Причина этого заключается в том, что асинхронность является частью определенной библиотеки, а не платформы JVM.
Если только Vert.x работает в кластерном режиме, возвращается к локальной блокировке:
public void getLockWithTimeout(String name, long timeout, Handler<AsyncResult<Lock>> resultHandler) {
...
if (clusterManager == null) {
getLocalLock(name, timeout, resultHandler);
} else {
...
}
}
getLock
использует LocalAsyncLocal
под:
localAsyncLocks.acquire(vertx.getOrCreateContext(), name, timeout, resultHandler);
acquire()
использует ConcurrentHashMap.compute
подкапот: https://github.com/eclipse-vertx/vert.x/blob/master/src/main/java/io/vertx/core/shareddata/impl/LocalAsyncLocks.java#L91
Так что, если вы действительно хотите иметь собственную реализацию, вы можете черпать вдохновение из приведенного выше кода.