【问题标题】:The best Lock for concurrency: one WRITE and infinite number of READ最好的并发锁:一次 WRITE 和无限次 READ
【发布时间】:2013-04-16 14:52:51
【问题描述】:

Java 中是否有任何 Lock 允许我这样做?

  • 一次 WRITE 操作
  • 无限次数的 READ 操作(即使 获得了 WRITE 锁)
  • 可选但很棒:锁定超时 - 一段时间后释放锁定以避免永远死锁

【问题讨论】:

  • ...这叫写锁,读不锁?
  • @Xymotech 是的,但是即使已经获得了写锁,读取操作仍然必须能够继续
  • 我不明白为什么写锁会阻止读取发生。如果您在读取时根本不请求锁定,那么没有什么可以阻止您...
  • ReentrantReadWriteLock ?
  • @Xymotech 现在我明白你的意思了,你是对的......那么可选的东西 - 超时。这可能吗?

标签: java concurrency locks


【解决方案1】:

听起来好像没有不能发生读取的情况。你真的需要读锁吗?如果没有,那么您应该只能使用带有 1 个许可证的 Semaphore 来保护写权限。如果您仍然想在无法阻止任何读取的情况下跟踪正在发生的读取次数,您可以随时使用AtomicInteger 计算正在运行的读取次数。

【讨论】:

  • 你是对的。我不需要读锁。但是 Semaphore 在超时后似乎无法释放许可。
  • @Tomas 我知道许多锁在获取阶段可能会超时,但我不知道有任何锁在获取后会自动释放。你可能需要为此编写一些自定义的东西,但我觉得我应该强烈警告不要这样做。如果您的任务运行时间超过超时,您在多个写入者存在的情况下发生数据损坏。为避免死锁,我认为您最好注意查看无进度状态,然后在发生这种情况时查看interrupting 任务。
猜你喜欢
  • 1970-01-01
  • 2012-11-14
  • 2015-10-12
  • 1970-01-01
  • 2015-03-01
  • 2018-01-08
  • 1970-01-01
相关资源
最近更新 更多