现在有一个需求:在单服务器中,有一个业务方法需要根据客服端传过来的参数订单ID来决定处理方式。如果订单ID相同,则并发访问这个业务方法;如果订单ID不相同,则可以并行访问这个业务方法。
下面是自己认为的解决方案:
1、定义同步处理类
@Component
public class SynchronizedByKey {
// 缓存锁
private final ConcurrentHashMap<String, ReentrantLock> keyToReentrantLockMap = new ConcurrentHashMap<>();
/**
* 判断key的值是否相同,相同则并发执行任务,不相同则并行执行任务。
* [1] 必须要保证线程拿着的锁与缓存中的锁是同一个锁,才允许执行任务
* @param key 键值
* @param statement 任务
*/
public void exec(String key, Runnable statement){
// 线程拿着的锁
ReentrantLock lock = null;
// 缓存中的锁