Java-如何根据请求中的值将线程置于等待状态?

Java-如何根据请求中的值将线程置于等待状态?,java,database,multithreading,Java,Database,Multithreading,我们有一个使用JSON数据的REST服务。其中一个标签是Analysis\u Id。 此服务的任务是获取数据并将其返回。但是,有配额限制。 分析Id中具有特定值的请求(比如1111)只能提交25次请求。此限制在表中配置。当发出请求并且REST服务成功地抛出响应时,将在事务表中进行插入。每当提交新请求时,都会检查此表,以验证是否已超过配额。 问题是某人可以同时提交多个请求。为了限制这一点,如果已经有一个请求使用相同的分析id进行服务,我们需要将请求保持在挂起状态。 实施它的最佳方法是什么 提前感谢

我们有一个使用JSON数据的REST服务。其中一个标签是Analysis\u Id。 此服务的任务是获取数据并将其返回。但是,有配额限制。 分析Id中具有特定值的请求(比如1111)只能提交25次请求。此限制在表中配置。当发出请求并且REST服务成功地抛出响应时,将在事务表中进行插入。每当提交新请求时,都会检查此表,以验证是否已超过配额。 问题是某人可以同时提交多个请求。为了限制这一点,如果已经有一个请求使用相同的分析id进行服务,我们需要将请求保持在挂起状态。 实施它的最佳方法是什么


提前感谢。

如果您只想使用与
synchronized
关键字相同的语义,但特定于一个
分析\u Id
,您可以通过手动维护锁轻松获得它:

//shared map
Map<String, Lock> locks = new ConcurrentHashMap<>(); //very important it's concurrent
...
//when a request arrives
locks.putIfAbsent(analysisId, new ReentrantLock()); //use computeIfAbsent if on Java 8
Lock lockForThisId = locks.get(analysisId);
lockForThisId.lock();
//do processing, update DB etc
lockForThisId.unlock();

然后,如果它
Collections.synchronizedMap
,则进行包装,但更好的方法是使用适当的缓存,如or。

一个附加组件:当REST服务处理以1111作为分析Id的请求时,它应该保留任何具有相同值的新请求。但是,如果它收到另一个2222作为分析Id的请求,它必须通过。非常感谢。按预期工作。然而,有两种情况下我被卡住了。我应该在前面指出,一个是在某些情况下,我需要创建一个新线程来完成这项工作。但是当前线程不能等待这个新线程完成,因为当前线程需要返回一些响应。因此,解锁锁的责任将由该新线程承担。这就是它失败的地方。当新线程尝试解锁时,它会抛出异常IllegalMonitorStateException,这可能是因为解锁发生在不同的作用域中。任何关于解决方法的想法都将受到欢迎。还有一个问题是ID的值在数据库中有一些过期日期。因此,一段时间后,可能是三个月后,没有任何请求会以该值到达。但映射仍将包含一个以该ID值为键的锁实例。几个月后,地图上会有很多不会被使用的钥匙。有没有办法解决这个问题。。。。提前谢谢。
public class LRUCache<K, V> extends LinkedHashMap<K, V> {
  private int cacheSize;

  public LRUCache(int cacheSize) {
    super(16, 0.75, true);
    this.cacheSize = cacheSize;
  }

  protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
    return size() >= cacheSize;
  }
}