我正在开发一个 servlet,我想让我的 servlet 同步。所以请任何人都可以帮助我,这怎么可能。
3 回答
使 servlet 同步是一个非常糟糕的设计。它的主要目的将被破坏。Servlet 应该被设计成可以同时处理多个请求!而且,servlet 不应该包含任何状态存储和按需要进行同步。请重新考虑您的设计
每当您同步代码块时,都会在系统中引入瓶颈。当你同步一个代码块时,你告诉 JVM 在给定时刻只有一个线程可能在这个同步的代码块中。如果我们运行一个多线程应用程序并且一个线程遇到另一个线程正在执行的同步代码块,那么第二个线程必须等到第一个线程退出该块。
准确识别真正需要同步的代码块并尽可能少地同步非常重要。
请注意,您不需要(也不应该)同步本地数据或参数。尤其是你不应该同步 service() 方法!(或 doPost()、doGet() 等)
启用线程安全 servlet 的更好方法是什么?SingleThreadModel 接口还是同步?
虽然 SingleThreadModel 技术易于使用,并且适用于低容量站点,但它的扩展性并不好。如果您预计您的用户在未来会增加,您最好对共享数据实施显式同步。然而,关键是要有效地减少同步的代码量,以便最大限度地利用多线程。
另外,请注意,从服务器的角度来看, SingleThreadModel 是相当资源密集型的。然而,最严重的问题是并发请求的数量耗尽了 servlet 实例池。在这种情况下,所有未服务的请求都会排队,直到有东西空闲——这会导致性能下降。由于使用情况是不确定的,即使您确实添加了更多内存并增加了实例池的大小,它也可能无济于事。
使 servlet 同步确实是一个糟糕的设计。您一次不能处理一个以上的客户。如果您希望代码的某些部分是线程安全的,我建议您同步代码块。请看这里