Javaでは、2つのクラスが3番目のクラスのメソッドを同時に呼び出すとどうなりますか?

StackOverflow https://stackoverflow.com/questions/4843220

質問

私のプロジェクトには、クライアントクラスによって呼び出されるゲームクラスがあります。現時点では、ゲームクラスはファイルへのパスを書き込み、クライアントクラスはこのファイルから読み取り、内容をクリアします。ここでのアクセスとの競合が多すぎるため、パスデータを格納するメソッドとして別のクラスを使用したいと思います。ただし、それでも問題が発生するかどうか、またはゲームクラスがストレージクラスのメソッドを呼び出して書き込みを試み、同時にクライアントクラスがストレージのメソッドを呼び出すと、結果はどうなるかを知りたいです。読んでクリアするクラス。

役に立ちましたか?

解決

スレッド化と同期について考える必要があるようです。「Javaの並行性の実践」を読むことをお勧めします。

他のヒント

複数のスレッドが存在する場合、クラスはスレッドセーフである必要があります。これを実現する1つの方法は、同時にアクセスされるメソッドをsynchronizedにすることです。

これがあなたが始めるための例です: ジェネラコディセタグプレ

synchronized修飾子がないと、このプログラムは印刷されます ジェネラコディセタグプレ

synchronizedキーワードを使用すると、一度に1つのスレッドのみがmethodを呼び出すことができるため、プログラムは出力します ジェネラコディセタグプレ

2つのクラスが別々のスレッドで実行されていると想定しているため、3番目のクラスに同時にアクセスする可能性があります。読み取りと書き込みを行っているリソースへのアクセスを同期(ミュート)する必要があります。Javaには「同期」というキーワードがあり、同時変更などを防ぐために複数の方法で使用できます。ここおよびここ詳細については

理論的に正しい答えは、「何でも起こり得る」です。

2つの呼び出しは次々に実行されるか、相互にインターリーブされる可能性があり、結果は予測できず、悲惨な結果になる可能性があります。

Javaがそれに対処するいくつかの方法を提供するのはそのためです。

  1. 最も簡単な(適切な)方法は、メソッドをスレッドセーフに記述することです。実際には、これは通常、ローカル変数のみを使用する必要があり、パラメーターとして渡されるオブジェクトを変更してはならないことを意味します。 (副作用はありません。)多くのメソッドは自動的にこのカテゴリに分類されます。その場合、同時実行性について心配する必要はありません。

  2. メソッドをスレッドセーフにできない場合は、何らかの方法で同時呼び出しを処理する必要があります。 synchronizedブロックが最も頻繁に使用される構造ですが、場合によっては、volatileフィールドまたはAtomic*クラスを使用するだけで十分です。ただし、この主題は重すぎて1つの回答でカバーできないため、同時実行チュートリアル

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top