【问题标题】:Java for Multiple Synchronous Blocks用于多个同步块的 Java
【发布时间】:2018-03-02 10:00:34
【问题描述】:

我有一些带有许多并发问题的旧代码。该代码使用套接字连接到服务器。 套接字是否连接有多个条件,这是通过使用布尔变量实现的(不会在多个线程之间使用)

一个明显的解决方案是: 添加更多锁,并嵌套锁,使连接状态同时锁定读取和写入状态,从而可以独立进行读取和写入锁。这会导致代码有些难看

还有哪些其他选择?

请记住,该系统已经过测试/生产中,并且是一个相当旧的系统,其功能被添加到现有类中(有时我会畏缩查看这些类)重写整个代码库是一种选择,只是最后一个我想做。

编辑: 由于我找到了一些答案并试图改写我的问题以更好地理解情况,我意识到这不是一个有解决方案的问题,而不要求重写现有代码,这是我想要防止的,但不可避免的。

【问题讨论】:

  • 为什么不做一个中间队列来保存你想要执行的操作并在单个线程或类似的东西中执行而不是进行显式同步?
  • 我同意:锁定总是容易出错。如果可能的话,把你的时间/精力投入到构建没有这种低级概念的东西上。
  • @GhostCat 完全正确。我觉得他前进的方向太容易出错了。
  • 听起来像xy problem。发布您的代码以及问题所在 - 可能有更好的方法来做事。另请查看ReentrantReadWriteLock
  • @ErwinBolwidt,请继续阅读,似乎是这样,在提问之前我很担心,我会重新提出问题。问题在于它是存在锁定/并发问题的现有代码,这是试图以最小的努力修复现有系统。

标签: java multithreading asynchronous


【解决方案1】:

关于您修改代码和后续系统/回归测试的评论。无论您是实现新的东西还是最终添加同步块和锁,您都必须进行相同数量的测试。

进行显式同步是一项有风险的业务。它是低级别的,因此容易出错。

另一种方法是使用 SOLID 的思想重新设计您的系统。创建一个抽象并隔离需要在适当结构中同步的代码片段。我之前通过将所有操作写入中间队列并在单个线程中使用元素来给出示例。我不知道您的代码和情况我不知道这是否适用。但这是一个关于如何通过引入中间结构来隐式解决并发问题的示例。

根据您的 cmets,我认为关键是无论您做什么 - 放置同步块或重新设计它。在我看来,您需要执行的测试量是相同的。但是拥有更好的模型肯定会为您节省大量调试和维护代码的时间。

【讨论】:

  • 所以重写所有读/写函数到一个新的类中,该类将隐式处理锁定?
  • @EatonEmmerich 它可以是一个也可以是多个类。您需要确保您所拥有的一切都在执行单一功能(SOLID)但是是的,将您的并发管理委托给第三方。
猜你喜欢
  • 1970-01-01
  • 2011-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多