并发:处理Web应用程序中的多个提交

时间:2012-04-16 09:50:46

标签: java web-applications concurrency

这是我朋友最近的面试问题:

您如何处理用户在屏幕中输入某些数据并让其中5个点击提交按钮* 相同时间 的情况? *

(与此同时,采访者坚持认为它们与纳秒级相同)

我的回答是让处理请求的方法同步,并且只有一个请求可以在给定时间获取方法上的锁。

但看起来面试官坚持认为有一种“更好的方法”来处理它。

另一种在数据库级别处理锁定的方法,但我认为它不是“更好”。

还有其他方法吗?这似乎是一个相当普遍的问题。

3 个答案:

答案 0 :(得分:4)

如果您只有一个网卡,则一次只能有一个请求。 ;)

他可能正在寻找的答案就像是

  • 使servlet无状态,以便它们可以同时执行。
  • 使用允许线程安全并发访问的组件,如Atomic *或Concurrent *
  • 仅在您必须使用的地方使用锁。

我更喜欢做的是让服务变得如此之快,以便在下次resquest之前响应。;)虽然我不会担心Java EE或数据库的开销。

答案 1 :(得分:2)

他们同时点击是否重要,例如他们是否都在更新数据库中的相同记录?

同步方法不会削减它,特别是如果它是分布在多个JVM之间的webapp。同步方法也可以阻塞,但是其他线程只会在第一次完成后触发并且您丢失了写入。

因此,锁定数据库级别似乎是这里的选项,即如果记录已更新,则向第一次更新服务的用户报告错误。

答案 2 :(得分:1)

您不必担心这一点,因为Web服务器在隔离线程中启动每个请求并对其进行管理。

但是如果你有一些共享资源就像某个文件用于日志记录那么你需要实现并发并在请求和内部请求中对它进行线程锁定