4

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

您将如何处理用户在屏幕上输入一些数据并假设其中有 5 个在相同时间单击提交按钮的情况*

(同一时间,面试官坚称它们是纳秒级的)

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

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

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

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

4

3 回答 3

4

如果你只有一张网卡,你一次只能有一个请求下来。;)

他可能正在寻找的答案是

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

我更喜欢做的是让服务如此之快,它可以在下一个请求到来之前做出响应。;) 虽然我不需要担心 Java EE 或数据库的开销。

于 2012-04-16T09:58:49.647 回答
2

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

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

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

于 2012-04-16T09:56:34.013 回答
1

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

但是如果你有一些共享资源,比如一些用于记录的文件,那么你需要实现并发并在请求和请求间对其进行线程锁定

于 2012-04-16T09:53:40.563 回答