gpt4 book ai didi

java - 在java中的某些条件下阻塞线程

转载 作者:行者123 更新时间:2023-11-29 03:52:22 26 4
gpt4 key购买 nike

也许这是一个非常愚蠢的问题,但请听我说完。我有一个用例,我收到许多并发请求为特定输入日期做某事。如果在同一输入日期收到两个并发请求,则在前一个请求完全完成(有充分理由)之前,不应继续执行后续请求。使用标准 java.util.concurrent 组件实现此目的的最佳方法是什么?我最初的想法是拥有一个 LockFactory,它将出售锁并保留一份副本以指示它正在使用中,后续请求将在其上等待()。但是,这似乎有很多样板代码 - 有什么更简单的技巧让我望而却步吗?

提前致谢!

最佳答案

您可以根据日期时间散列各个锁。

private static final ConcurrentMap<Long,Lock> dateLock = new ConcurrentHashMap<Long,Lock>();

public static Lock getLock(Date date){
Lock lock = dateLock.get(date.getTime());
if(lock == null){
Lock lock = new ReentrantLock();
Lock temp =dateLock.putIfAbsent(lock);
lock = temp == null ? lock : temp;
}
return lock;
}

如果您需要同一天但不一定是精确的毫秒日期,您可以执行类似的操作

private static final ConcurrentMap<String,Lock> dateLock = new ConcurrentHashMap<String,Lock>();

public static Lock getLock(Date date){
String formattedDate = new SimpleDateFormat("MM\dd\yyyy").parse(date);
Lock lock = dateLock.get(formattedDate);
if(lock == null){
Lock lock = new ReentrantLock();
Lock temp =dateLock.putIfAbsent(lock);
lock = temp == null ? lock : temp;
}
return lock;
}

然后在某个日期需要互斥的任何请求

Date date = ...;

Lock lock = getLock(date);
lock.lock();

等等

关于java - 在java中的某些条件下阻塞线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8157049/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com