package com.fjhx.utils;

import cn.hutool.core.thread.ThreadUtil;
import com.fjhx.constants.ErrorMsgConstant;
import org.springblade.core.log.exception.ServiceException;

import java.util.function.BooleanSupplier;

/**
 * 锁工具类
 */
@SuppressWarnings({"unused"})
public class LockUtil {

    /**
     * 乐观锁
     *
     * @param maxRetryCount   最大重试次数
     * @param millis          再次执行等待时长
     * @param booleanSupplier 执行方法
     */
    public static void optimisticLock(int maxRetryCount, long millis, BooleanSupplier booleanSupplier) {

        int retryCount = 0;

        while (retryCount < maxRetryCount) {
            if (booleanSupplier.getAsBoolean()) return;
            retryCount++;
            ThreadUtil.sleep(millis);
        }

        throw new ServiceException(ErrorMsgConstant.SYSTEM_BUSY_ERROR);
    }

    /**
     * 乐观锁
     * <p>默认最多执行3次，每次失败等待300毫秒</p>
     *
     * @param booleanSupplier 执行方法
     */
    public static void optimisticLock(BooleanSupplier booleanSupplier) {
        optimisticLock(3, 300, booleanSupplier);
    }

//    /**
//     * 加锁获取缓存，防止缓存击穿
//     *
//     * @param cacheKey 缓存key
//     * @param lock     锁对象
//     * @param supplier 执行获取缓存方法
//     * @param <T>      缓存值
//     * @return 缓存值
//     */
//    public static <T> T cacheLock(String cacheKey, Lock lock, Supplier<T> supplier) {
//        T change = RedisCache.get(cacheKey);
//        if (ObjectUtil.isNull(change)) {
//            try {
//                lock.lock();
//                change = RedisCache.get(cacheKey);
//                if (ObjectUtil.isNull(change)) {
//                    change = supplier.get();
//                    RedisCache.set(cacheKey, change);
//                }
//            } finally {
//                lock.unlock();
//            }
//        }
//        return change;
//    }

}
