3

私は、大学の研究室の 2 つのサーバー クライアント間でプレイされる単純なじゃんけんゲームを構築してきました。2 つのクライアントがサインオンしたときにゲームを開始する非常に単純なサーバーがあります。それはこのように動作します:

サーバーはゲーム オブジェクトを作成し、プレイヤー クライアントがゲームを要求するのを待ちます。

2 人のプレイヤーがゲームをリクエストすると、サーバーはプレイヤー 1 オブジェクトとプレイヤー 2 オブジェクトを作成し、ゲーム オブジェクトをそれぞれのコンストラクターに渡します。

プレイヤーはプレイヤー オブジェクトのメソッドを呼び出し、それがゲーム オブジェクトのメソッドを呼び出します。ゲーム オブジェクトには同期メソッドが含まれています。

各プレイヤーは、ゲーム オブジェクトに格納されている動きを行い、ゲーム オブジェクトは勝者を計算します。

プレーヤー オブジェクトは、ゲーム オブジェクトで同じメソッドを呼び出します。これはすべて正常に機能します。しかし、私の友人は、どのメソッドでも wait() または notify() を呼び出さないという事実に戸惑いました。彼はすでに自分の研究室を発表し、合格しています。彼は同期メソッド内の wait() と notify() について尋ねましたが、彼女の応答はあいまいで、まだ確信が持てないと言いましたが、念のためにそれらを入れておく必要があります. それで、取引は何ですか?? 同期メソッドで wait() と notify() が必要ですか?

また、Java 仮想マシン間で同期が機能しないと読みましたが、これは本当ですか? もしそうなら、これは私のゲームにどのように影響しますか、同期は何かをしていますか??

どうもありがとう。

4

3 に答える 3

2

wait()notify()単一の JVM 内のスレッド間の明示的な通信のためのメカニズムです。非常に単純化しすぎると、wait()「あなたの番です」のようなnotify()意味で、「OK、終わりました」という意味になります。「安全のために」それらを追加する必要はありませ。実際、その考えはまったくばかげています。

このsynchronizedキーワードは主に、すべてのスレッドが同じ有効な共有データ ビューを参照できるようにするために使用されます。それが解決しようとしている問題は、別々の JVM 間で発生することはあり得ないので、その場合は何もしないという事実は問題ありません。

于 2013-06-10T20:05:16.780 に答える
0

あなたのコードを見ることができないので、同期されたメソッドに関するいくつかの基本的なヘルプしか提供できません。同期は、2 つのスレッドが同時にリソースへのアクセスまたはリソースの変更を試みないようにするために使用されます。これにより、そのリソースが不確定な状態のままになる可能性があります。

ただし、これは特殊なケースであるため、アプリケーションを何千回も実行しても問題は発生しない可能性がありますが、2 つのスレッドが一度に同じ値を変更しようとすると、奇妙なエラーが発生し、変更されません。簡単に再現できます。

于 2013-06-10T20:11:06.963 に答える