Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 面谈任务:限制使用令牌的并发请求数_Java_Database_Multithreading - Fatal编程技术网

Java 面谈任务:限制使用令牌的并发请求数

Java 面谈任务:限制使用令牌的并发请求数,java,database,multithreading,Java,Database,Multithreading,在一次采访中,我得到了这个问题 场景:在数据库表中,有针对公共资源的条目。让我们说列名“token”。总共有500个代币。一个web应用正在使用此令牌表。因此,每当一个用户点击web应用程序URL时,就会为该用户分配一个令牌。令牌一旦分配给用户,其他用户就不能使用它。所以对于另一个用户,若一个令牌显示已经使用,系统将尝试分配另一个令牌,以此类推 问题:现在,在给定的时间点上,假设有600个用户点击了web应用程序,如何确保只有500个用户会获得令牌,其余100个不会 谢谢。如果我设计这个,我会把

在一次采访中,我得到了这个问题

场景:在数据库表中,有针对公共资源的条目。让我们说列名“token”。总共有500个代币。一个web应用正在使用此令牌表。因此,每当一个用户点击web应用程序URL时,就会为该用户分配一个令牌。令牌一旦分配给用户,其他用户就不能使用它。所以对于另一个用户,若一个令牌显示已经使用,系统将尝试分配另一个令牌,以此类推

问题:现在,在给定的时间点上,假设有600个用户点击了web应用程序,如何确保只有500个用户会获得令牌,其余100个不会


谢谢。

如果我设计这个,我会把令牌设计成一堆,你把令牌取下来/放回去。如果没有令牌,则等待令牌在堆栈中可用

就多线程而言,实际的堆栈pop调用应该在一个同步块中,因此每次只能有一个线程能够弹出。

您需要做的是在请求启动时检查是否有空闲令牌,如果有空闲令牌,则获取一个令牌,并在工作完成时释放它。因为问题是关于数据库的,所以我认为它暗示了如何实现检查和获取的原子性:使用事务

例如,您可以有一个包含500行令牌的表,其中包含一个过程,该过程将从数据库中选择一个空闲令牌,如果有,则更新其行以将其标记为已使用。此过程将在事务中运行。如果结束时没有可用的令牌,那么服务线程将等待,并在短时间后重试。释放令牌也是对行的一个简单更新


另一种选择是从一个空表开始,通过插入新行获取令牌。再次检查一下,感谢您的建议。这个想法在分布式环境中不起作用@Mifeet的答案对我来说似乎完全可以。还有一件事,“volatile”关键字在这里有用吗?谢谢您的方法。示例仅适用于500行。如果令牌有数百万行,那么在给定的时间点,让我们点击2K个用户。