【问题标题】:Do I need to use Mutex with object instances?我需要将 Mutex 与对象实例一起使用吗?
【发布时间】:2011-03-23 15:52:48
【问题描述】:

我需要对对象使用互斥锁吗 可能同时发生的实例 更新不同的对象实例?

这是一个例子:


我有 5 个 Pen 对象实例、50 个作者线程3 个 Paper 对象实例
任意数量的作者可以使用任意数量的笔在任何给定的纸上书写。 我创建了阻塞队列来保护作者访问的 Pen 对象。 但是, Pen 实例需要从 Author 线程中获取数据并将其附加到(指定的)Paper 实例中。


问题:我需要阻止 之前写笔的动作 更新 Paper 实例?

【问题讨论】:

  • 您可以为您的示例发布一些代码吗?还有,这是作业吗?
  • @Thomas 这不是一个假设的问题,所以我没有代码。所以,这也不是功课:)
  • @Thomas 抱歉,错字 - 我的意思是:这是一个假设性问题。
  • 普通锁/同步会比使用阻塞队列更简单/更有效。
  • @Tom,这与您在帖子中所说的有何不同?

标签: java concurrency mutex


【解决方案1】:

您可能必须同步论文的附加操作或阻止访问,因为您可能有 5 个作者试图同时写一篇论文。因此,每当作者访问一篇论文时,您都需要为其他人屏蔽它。

如果一位作者可以使用多支笔(我现在无法理解 ;))你也可以防止多支笔同时写到纸上,所以在纸上写上同步(钢笔)/附加方法。

【讨论】:

  • 感谢您的回答。这是我所期待的。然而,多支笔可能通过多个用户起作用。写入函数在 Pen 对象中,它接受写入内容、作者 ID 和论文 ID。所以,我猜 Pen 在 Paper 对象上为更新所做的任何函数调用都应该更新?我看到了 Paper 对象函数上的同步是如何工作的 :) 谢谢!
【解决方案2】:

为什么你的 Pen 对象会有任何状态?在我看来,Paper 是状态持有者。出于某种原因,笔是一种有限的资源,可以,但我不明白为什么你需要在其中包含状态。

如果您的 Pen 是无状态的,或者至少具有不可变状态,那么它根本不需要任何锁。

【讨论】:

  • 我不确定 Pen 有状态的问题在哪里出现。但是使用锁或同步方法的原因是因为潜在的 5 个作者线程可能正在使用所有 5 个笔实例。在这种情况下,如果所有 5 支 Pen 都在尝试在纸上进行 write(),那么这个 write() 方法需要同步。也就是说,如果我不是一个完全的傻瓜;)
  • @Tom 如果 Pen 没有状态,那么 write() 是唯一可能需要保护的东西,具体取决于 write 所做的状态更改及其排序要求。例如,如果你写一行文本,可能你只想要一个线程安全的行容器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多