有一个巴士预订站点,大约有10万个线程在运行,但总座位数只有20个。您将如何控制性能以及Java多线程处理方法是什么?
我回答说我将使用同步方法或阻塞,因为它将控制并发线程,而锁将阻止异步执行。
但是面试官打断了我,并说同步化是一个虚假的想法,性能会下降,并且没有帮助。
请让我知道我是否缺少任何其他可以解决此问题的有用多线程概念
答案 0 :(得分:2)
您必须使用许可证20的信号量,这意味着如果将乘客视为线程,则一次可以容纳20位乘客。仅在核心Java多线程的情况下,这可能是答案。
答案 1 :(得分:1)
这个问题与线程概念无关。采访者实际上希望您不要使用锁定,因为如果100K线程正在访问同一对象,这会使应用程序非常慢。可以通过乐观锁定(在jpa或休眠状态)来实现。
这是通过数据库表中的版本列以及实体类中的相应版本属性(@Version批注)来完成的。修改一行后,版本值会增加。原始事务检查版本属性,如果数据已被另一个事务修改,则将抛出javax.persistence.OptimisticLockException,并且原始事务将回滚。我们也可以使用Date和timeStamp。
答案 2 :(得分:1)
问这样的问题的面试官不是在寻找某些特定的解决方案或想法。他们希望听到您如何考虑同步。一个明智的答案可能是:
拥有这么多线程,显然没有人关心性能。如果您关心性能,请减少线程数。他们只是在争夺相同的资源。
但是,如果必须有这么多线程,那么使用锁就很有意义了,因为它将大部分线程保持处于就绪状态,这样可以抵消由于拥有这么多线程而带来的一些危害。尽可能。尽管除锁以外的其他方法可能会使更多线程同时运行,但由于线程之间的竞争会导致大量的高速缓存ping-poning和其他问题,这可能会降低性能。线程数量如此之多,阻止它们中的大多数是避免执行线程之间争用的最佳策略,并允许这个设计欠佳的应用程序实际上至少可以完成一些工作。
再次,如果您确实希望此操作合理,则必须从疯狂的线程数问题中重新构造它。