【问题标题】:Making everything synchronized except one method使除一种方法之外的所有内容都同步
【发布时间】:2018-11-12 20:34:57
【问题描述】:

假设我们有大量以前编写的代码,其中许多部分可能不是线程安全的。我们在代码中添加了一个方法,该方法在运行时某处被调用,这非常耗时,但可以实现线程安全。有没有办法让除了方法之外的所有东西都同步,这样我们就可以运行程序的多个线程,并确保只有线程安全的方法是并行运行的?如果没有,可以做些什么来并行运行该方法,但其他所有内容一次运行一个? (假设由于代码的复杂性和调用方法之前所需的初始化,我们无法将方法的运行与其余代码分开,并且方法在运行中间的某个位置被调用)

【问题讨论】:

  • 线程是否可以在运行线程安全方法的同时其他线程正在运行其他方法之一?如果不是,那么ReadWriteLock 就是答案,其中“线程安全”方法采用读锁,所有“同步”方法采用写锁(而不是同步)。
  • 但是我不能修改所有其他方法(比如 1000 种方法)来获取锁定。
  • 1000 种方法?所有这些方法都是相互排斥的吗?那是代码的味道。听起来像God object
  • 不一定是一类。

标签: java multithreading synchronized


【解决方案1】:

我认为问题在于这个“线程安全”方法是从同步方法中调用的,因此它将在同步块内运行。

如果这个方法有一个返回值,或者它改变了稍后在同步块中使用的任何对象,那么我认为没有办法解决这个问题。

但是,如果此方法没有返回值,并且当前线程稍后不需要其任何结果,那么您可以将其实现为异步方法。

我在当前项目中有一个类似的解决方案:我必须将事件记录到外部数据库中。所以我的 logEvent 是一个异步方法,虽然它本身很慢,但至少它不会减慢父线程的速度。

【讨论】:

  • 确实,它的效果用在程序的其余部分。
  • 好吧,也许它仍然可以做到,但它需要大量的重构,并且很大程度上取决于其他方法。 (我认为我最初的答案仍然是正确的,因为没有简单的方法来实现它)但是您必须通过将不安全的部分移动到较小的同步块来重构整个代码。 - 但这取决于逻辑。理论上没有是/否的答案。
猜你喜欢
  • 2018-01-12
  • 1970-01-01
  • 2020-03-01
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-18
相关资源
最近更新 更多