/* * Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com * The software in this package is published under the terms of the CPAL v1.0 * license, a copy of which has been included with this distribution in the * LICENSE.txt file. */ package org.mule.runtime.core.util; import org.mule.runtime.core.util.func.CheckedRunnable; import org.mule.runtime.core.util.func.CheckedSupplier; import java.util.concurrent.locks.Lock; /** * Utilities for concurrency * * @since 4.0 */ public class ConcurrencyUtils { /** * Safely releases the given {@code lock} without failing if it is in an illegal state * * @param lock a {@link Lock} */ public static void safeUnlock(Lock lock) { try { lock.unlock(); } catch (IllegalMonitorStateException e) { // lock was released early to improve performance and somebody else took it. This is fine } } /** * Returns the value of the given {@code supplier} between the boundaries of * the given {@code lock}. It guarantees that the lock is released * * @param lock a {@link Lock} * @param supplier a {@link CheckedSupplier} * @param <T> the generic type of the returned value * @return the supplied value */ public static <T> T withLock(Lock lock, CheckedSupplier<T> supplier) { lock.lock(); try { return supplier.get(); } finally { safeUnlock(lock); } } /** * Execute the given {@code delegate} between the boundaries of * the given {@code lock}. It guarantees that the lock is released * * @param lock a {@link Lock} * @param delegate a {@link CheckedRunnable} */ public static void withLock(Lock lock, CheckedRunnable delegate) { lock.lock(); try { delegate.run(); } finally { safeUnlock(lock); } } private ConcurrencyUtils() {} }