如何在java中以最有效且无需同步的方式处理多个线程?

如何在java中以最有效且无需同步的方式处理多个线程?,java,multithreading,thread-safety,Java,Multithreading,Thread Safety,这里有一个公交车预订网站,大约有10万个线程在上面运行,但总座位只有20个。您将如何控制性能,在Java多线程中采用什么方法 我回答说,我将选择同步方法或块,因为它将控制并发线程,而锁将阻止异步执行 但面试官打断了我的话,说syncronize是一个虚假的想法,性能会下降,而且没有帮助 如果我缺少任何其他有用的多线程概念来解决此问题,请告诉我您必须使用许可证20的信号量,这意味着如果乘客被视为线程,每次20名乘客可以占用座位。这可能仅在核心java多线程的情况下才是答案。这个问题与线程概念无关。

这里有一个公交车预订网站,大约有10万个线程在上面运行,但总座位只有20个。您将如何控制性能,在Java多线程中采用什么方法

我回答说,我将选择同步方法或块,因为它将控制并发线程,而锁将阻止异步执行

但面试官打断了我的话,说syncronize是一个虚假的想法,性能会下降,而且没有帮助


如果我缺少任何其他有用的多线程概念来解决此问题,请告诉我

您必须使用许可证20的信号量,这意味着如果乘客被视为线程,每次20名乘客可以占用座位。这可能仅在核心java多线程的情况下才是答案。

这个问题与线程概念无关。面试官实际上希望您不要使用锁定,因为如果100K线程正在访问同一个对象,那么这将使应用程序非常慢。它可以通过jpa或hibernate中的乐观锁定来实现

这是由数据库表中的一个版本列完成的,该列在实体类中具有相应的版本属性@version annotation。修改行时,版本值将递增。原始事务检查version属性,如果数据已被另一个事务修改,则将抛出javax.persistence.OptimisticLockException,并回滚原始事务。我们也可以使用日期和时间戳

请看这里

问这样问题的面试官不是在寻找具体的解决方案或想法。他们想听听你是如何解释同步的。一个明智的答案可能是:

有这么多线程,显然没有人关心性能。如果您关心性能,请减少线程数。他们只是在争夺同样的资源

但是,如果必须有这么多线程,那么使用锁是很有意义的,因为它将尽可能长时间地使大多数线程处于就绪运行状态,从而消除拥有这么多线程带来的一些危害。虽然锁以外的某些方法可能会使更多线程同时运行,但这可能会降低性能,因为线程会严重竞争,从而导致大量缓存乒乓和其他问题。对于如此多的线程,阻止其中大多数线程是避免执行线程之间争用的最佳策略,并允许这个设计糟糕的应用程序实际至少完成一些工作

再一次,如果你真的想让它明智地工作,你必须重新构建它,以摆脱疯狂的线程数问题


你说的“10万条线”是指10万条线吗?你的问题是什么:你是否在问面试官的批评是否正确?还是你在寻求其他的策略?编辑问题以澄清。太宽泛了。但第一条评论是正确的。在只有20个简单元素的数据结构上,任何多线程方案都不太可能奏效。单线程在这里可能是最好的。但问题也是一个窍门:一个真正的预订应用程序除了更新一个数据结构之外,几乎不可能什么都不用做,因此,在其他地方,多线程可能会有所帮助。@markspace这个问题的目的是检查多线程的深度知识,我相信面试官期待的是Senaphore概念,因为我发现它与我的场景非常相关。@BasilBourque我想知道解决这类问题的替代策略!无论如何,谢谢你的帮助!我认为乐观的锁定是行不通的。如果争用很高,那么所有线程都可能在尝试进行简单更新时被卡住太久。如果争用较低,则单个线程和单个同步锁可以正常工作。问题陈述在我看来仍然是假的。是的,我理解你的担忧。然而,同样的问题被问到了我,我无法回答,后来我问了同样的面试官,他是这家著名公司的一名建筑师,我得到了同样的答案。后来我进行了自己的研究,发现乐观锁定是解决方案。即使在hibernate网站上,他们也有这个解决方案。这忽略了更新时使用互斥的可能性。信号灯不会阻止两个人预订同一个座位。谢谢。。我还检查了信号量概念,它解决了我的问题!: