問題タブ [synchronized-block]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - この同期ブロックは必要ですか?
マルチスレッド環境でのこのコードの場合、synchronized(c) は必要ですか?
java - try ブロック内に同期ブロックを配置するか、同期ブロック内に try ブロックを配置する方がよいですか?
たとえば、これは良いですか?
または、これの方が良いです:
どれがベストプラクティスなのか疑問に思っていました。当然のことながら、try ブロック内のすべてのコードを同期する必要があります。try 内のコードの一部のみを同期する必要がある場合について話しているのではありません (この場合、try 内に synch ブロックを配置する方がよいと思います)。私の疑問は、すべての try ブロックを同期する必要がある場合です。
java - スレッドとの同期
2 つの質問があります...
特定の時間に 1 つのスレッドのみがアクセスできる関数を含むクラスがあります。これを
synchronized
関数またはsynchronized
ブロックにしても、異なるスレッドがクラス内でアクセスしているため、複数のスレッドを使用できます。このコードにアクセスするスレッドが 1 つだけであることを確認するにはどうすればよいですか? (以下のコード例を参照)同期関数を使用すると、関数の呼び出しがキューに入れられます。関数への最後の呼び出しのみがコードにアクセスできるようにする方法はありますか? そのため、Thread1 が現在関数にアクセスしている場合、Thread2 と Thread3 が (この順序で) アクセスしようとすると、Thread1 が完了すると Thread3 のみがアクセスを許可されます。
/li>
助けてくれてありがとう!
java - オブザーバー、オブザーバブル、ランナブル。同期ブロックがモニターを失ったのはなぜですか?
クラスを Observer および Observable として使用しようとしています。このクラスはスレッドとして実行されます。run() メソッドではスレッドが待機し、イベントを取得した後にスレッドに通知されます。サンプルコードがあります:
得られた出力は次のとおりです。
そして、スレッドはロックされたままです。期待される出力:
何がうまくいかないのですか?モニターがリリースされる前に同期ブロックに入るのはなぜですか? PS私は問題がMyThreadオブジェクトにオブザーバーを追加していると考えています.Threadオブジェクトにオブザーバーを追加するのでしょうか? しかし、どうすればこれを行うことができますか?
java - 同期点が 1 つしかない場合、デッドロックの可能性はありますか?
内部で同期ブロックを指定し、1 つのオブジェクトのみを使用してロックするいくつかのメソッド (5 または 6) を呼び出す 2 つの実行中のスレッドがあります。同期点が 1 つしかない場合、デッドロックの可能性はありますか? これまでのところ、そのような状況は見たことがありませんが、それでも. 手伝ってくれてありがとう。
java - 「this」と別のオブジェクトを同期ブロックのロックとして使用し、待機と通知を行う
2 つのコード ブロックがあり、一方は他方が通知するのを待ちます。
と
奇妙なことに、これが通知を待たなかったのは次のとおりです。
と
両方のセットの違いと、最初のセットが機能し、他のセットが機能しなかった理由について非常に興味があります。2 つのブロックが 2 つの異なるメソッドの 2 つの異なるスレッドに存在することに注意してください (それが役立つ場合)。
なぜそうなのか誰かが説明してくれることを願っています。より詳細になるように、質問を編集しました。
java - 同期ブロックが機能しない
この演習は、キャシー・セイラとバート・ベイツによる SCJP からそのまま引用したものです。
コード ブロックの同期
この演習では、コード ブロックの同期を試みます。そのコード ブロック内でオブジェクトのロックを取得し、コード ブロックの実行中に他のスレッドがオブジェクトを変更できないようにします。すべて同じオブジェクトを操作しようとする 3 つのスレッドを作成します。各スレッドは 1 つの文字を 100 回出力し、その文字を 1 ずつ増やします。使用するオブジェクトは StringBuffer です。
String オブジェクトで同期することはできますが、作成された文字列は変更できないため、新しい String オブジェクトを生成せずに文字をインクリメントすることはできません。最終的な出力には、100 個の As、100 個の B、および 100 個の C がすべて切れ目のない行で含まれている必要があります。
- クラスを作成し、Thread クラスを拡張します。
- Thread の run() メソッドをオーバーライドします。これは、コードの同期ブロックが移動する場所です。
- 3 つのスレッド オブジェクトが同じオブジェクトを共有するには、引数で StringBuffer オブジェクトを受け入れるコンストラクターを作成する必要があります。
- 同期されたコード ブロックは、手順 3 から StringBuffer オブジェクトのロックを取得します。
- ブロック内で、StringBuffer を 100 回出力してから、StringBuffer 内の文字をインクリメントします。これに役立つ StringBuffer メソッドについては、第 6 章を参照してください。
- 最後に、main() メソッドで、文字 A を使用して単一の StringBuffer オブジェクトを作成し、クラスの 3 つのインスタンスを作成して、3 つすべてを開始します。
上記の演習用に以下のクラスを作成しました (100 文字ではなく、10 文字を印刷しています)。
次のような出力 (10 As、10 B、10 C) を期待していましたが、取得できませんでした。
代わりに、次のようなさまざまな出力が得られました。これは、3 つのスレッドが他のスレッドが終了する前にループに入る機会を得ているためです。
私の質問は、run メソッドの同期ブロックが機能しないのはなぜですか?
java - バイトコードでモニターを適切に終了するにはどうすればよいですか?
モニターを適切に処理する方法を理解しようと、JVM 仕様を読んでいました。関連するセクションで提供されている例は次のようになります。
2 番目の例外テーブル エントリが必要な理由がわかりません。によって例外がスローされた場合、monitorexit
本当にモニターを終了したいですか? 私が知る限り、スローされる可能性のある例外はNullPointerException
とIllegalMonitorStateException
です。