【发布时间】:2016-10-05 09:38:40
【问题描述】:
我有很多客户端 Ai (A1,...,An) 每个人都执行动作 X。还有一个服务器 B 执行动作 Y。但是只有在没有人执行 X 的情况下才能完成 Y。
于是我想到了互斥锁:每个客户端都有自己的锁李。对客户端来说没问题,但是对服务器B来说就很可怕了,像这样:
synchronized(L1){
synchronized(L2){
...
}
}
这类问题有更好的解决方案吗?
【问题讨论】:
-
使用信号量或原子计数器并采用它来跨服务器工作
-
如果我使用信号量,我应该将许可证的数量精确到客户端的数量。
-
@Silver 不正确。您可以创建一个具有 1000 个许可的
Semaphore,并让 B 始终尝试获取所有 1000 个许可。如果任何客户端已签出,则必须等待。 -
@Silver ofc 您不能直接使用,但可以使用它的同步优势来获取收益,就像 Kayman 指出的那样。您始终可以拥有 Long.maxVal 许可 - 客户端将仅获取和释放单个许可,而服务器将始终获取所有许可(因此阻止直到那时)完成工作并释放获取的许可以允许客户端再次工作。
-
@Kayaman 好吧,在客户端之间,彼此之间不应该有任何障碍。如果我修复 1000 个许可证,可能会有风险。
标签: java mutex semaphore synchronized locks