4

これは私の友人への最近のインタビューの質問です:

ユーザーが画面にデータを入力し、そのうちの 5 人が [送信] ボタンを同じ時間にクリックしたとしましょう。*

(同時に、インタビュアーはそれらがナノ秒のレベルまで同じであると主張しました)

私の答えは、リクエストを処理するメソッドを同期させ、一度に 1 つのリクエストだけがメソッドのロックを取得できるようにすることでした。

しかし、インタビュアーはそれを処理するための「より良い方法」があると主張し続けたようです.

データベース レベルでロックを処理するもう 1 つのアプローチですが、「より良い」とは思いません。

他のアプローチはありますか。これはかなり一般的な問題のようです。

4

3 に答える 3

4

ネットワーク カードが 1 つしかない場合は、一度に 1 つの要求しか受信できません。;)

彼がおそらく探している答えは次のようなものです

  • サーブレットをステートレスにして、同時に実行できるようにします。
  • Atomic* や Concurrent* などのスレッドセーフな同時アクセスを許可するコンポーネントを使用する
  • ロックは絶対に必要な場合にのみ使用してください。

私が好むのは、サービスを非常に高速にして、次のリクエストが来る前に応答できるようにすることです.;) Java EEやデータベースのオーバーヘッドを心配する必要はありません.

于 2012-04-16T09:58:49.647 に答える
2

同時にクリックすることは重要ですか。たとえば、両方ともデータベースの同じレコードを更新していますか?

特に、複数の JVM に分散された Web アプリケーションの場合は、同期方式ではうまくいきません。また、同期されたメソッドがブロックされる可能性がありますが、最初の完了後に他のスレッドが起動するだけで、書き込みが失われます。

したがって、データベース レベルでのロックはここでのオプションのようです。つまり、レコードが更新された場合は、最初の更新後に更新がサービスされたユーザーにエラーを報告します。

于 2012-04-16T09:56:34.013 に答える
1

Web サーバーは各リクエストを分離されたスレッドで起動して管理するため、これについて心配する必要はありません。

ただし、ロギング用のファイルなどの共有リソースがある場合は、同時実行を実現し、リクエストおよびインターリクエストでスレッドロックを設定する必要があります

于 2012-04-16T09:53:40.563 に答える