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

标签 java java.util.concurrent

也许这是一个非常愚蠢的问题,但请听我说完。我有一个用例,我收到许多并发请求为特定输入日期做某事。如果在同一输入日期收到两个并发请求,则在前一个请求完全完成(有充分理由)之前,不应继续执行后续请求。使用标准 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/

相关文章:

java - iterator.next() 中的 ConcurrentModificationException

java.util.concurrent - 为什么 Atomic{Type}Array 构造函数中需要 volatileWrite

java - 使用 toString 方法将 HashMap 转换为 String 时如何覆盖 = 符号?

java - 在java中通过反射调用通用方法

java - 当visible=false时阶段仍然接收事件?

java - 拥有一个线程池比多个线程池更好的设计

java - 可变实例对象的可见性

java - 如何将数字的 Unicode 转换为 Java 中的数字本身?

java - Facebook 身份验证对话框 : Aggregation Previews Not Showing Up

java - 何时在 java 多线程中重置 CyclicBarrier