【问题标题】:Synchronized block: lock many objects?同步块:锁定许多对象?
【发布时间】: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


【解决方案1】:

您可以尝试在所有节点之间共享 ReadWriteLock (ReentrantReadWriteLock)。服务器应该获取写锁,并且会阻塞所有客户端执行X。客户端应该获取读锁,而不是阻塞其他客户端。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多