問題タブ [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.

0 投票する
1 に答える
213 参照

java - 同期ブロックを使用した Java での同時実行で期待した結果が得られない

以下は簡単な Java プログラムです。「cnt」と呼ばれるカウンターがあり、インクリメントされてから「monitor」と呼ばれるリストに追加されます。「cnt」は​​複数のスレッドでインクリメントされ、値は複数のスレッドで「monitor」に追加されます。

メソッド「go()」の最後で、cnt と monitor.size() は同じ値になるはずですが、そうではありません。monitor.size() には正しい値があります。

コメント化された同期ブロックの 1 つをコメント解除し、現在コメント化されていないブロックをコメント化してコードを変更すると、コードは期待どおりの結果を生成します。また、スレッド カウント (THREAD_COUNT) を 1 に設定すると、コードは期待どおりの結果を生成します。

これは、複数の実コアを搭載したマシンでのみ再現できます。

0 投票する
1 に答える
241 参照

java - スレッド間の遅延の作成

すべて、多くのスレッドによって呼び出される API 呼び出しがあります。唯一の問題は、遅延ベットです。スレッドは 1 秒以上にする必要があります。同期ブロックなしで、1 つのスレッドが時間 t1 に API を呼び出している場合、他のすべてのスレッドは 1 秒間待機し、他のすべてのスレッドは t1 + 1 秒で API を呼び出します。これは私が望んでいないので、1 つのスレッドが他のすべてのスレッド ブロックを待機している限り、待機ブロック全体を同期ブロックに入れます。

これは機能します。ただし、これは最も効率的な方法ではないと思います。

任意の推奨事項は大歓迎です。

0 投票する
2 に答える
2183 参照

java - 異なるメソッドで同じオブジェクトのJava同期ブロック

Java の同期ブロックの概念を理解しようとしています。私が読んだドキュメントの時点で、ロック(インスタンス変数を使用した同期ブロック)を取得すると、そのクラスの同じオブジェクトの同期ロックを取得できないことがわかりました。しかし、次のスニペットを実際に使用してみると、私の理解が間違っていることがわかりました。

つまり、同時に 2 つの異なるメソッドでロック (同じインスタンス変数の同期ブロック) を取得できます。スレッドが開始されると、メソッドを実行し、無期限に待機し、同期ブロックから出ることはありません。同時に、同じスレッドを使用して stop メソッドを呼び出すと、同期ブロックに入り、notify ステートメントを実行します。Java doc を検索しましたが、何も見つかりませんでした。

これはコード スニペットです。

MyClass スレッドの管理方法のコード スニペットを次に示します。

私の理解によると、スレッドが開始されると、「ロック」オブジェクト(MyClassのrunメソッドの同期ブロック)でロックが取得されます。stop メソッドを呼び出すと、run メソッドが同期ブロックから出るまで無期限に待機する必要があります (この場合は発生しません)。しかし、私が実行したとき、メソッドを停止するための呼び出しが「ロック」オブジェクトのロックを取得し、オブジェクトに通知した結果、スレッドがシャットダウンしました。

0 投票する
2 に答える
324 参照

java - Java での同期ブロックの簡素化

Java の同期ブロックの概念に頭を悩ませています。シンクロナイズド メソッドを十分に理解できたと思います。そこで、同期メソッドの観点から同期ブロックを理解するのに役立つアナロジーを考えました。私が提案したこの同等性が正しいかどうか教えてください。また、現時点では非静的同期ブロックについてのみ言及しました。ただし、静的同期ブロックのポイントも歓迎します。

に等しい

objRef のクラス:

この類推は、同期ブロックが同期メソッドと同じように動作するというロジックに基づいています。つまり、スレッドがモニターでロックを取得すると、他のスレッドがその実行に干渉することはできなくなります。スレッドは、同期されたメソッド全体の実行を終了した場合にのみ、制御を放棄します。

0 投票する
1 に答える
498 参照

java - notify/wait() を使用して特定の (グループの) スレッドをウェイク/サスペンドするにはどうすればよいですか?

たとえば、 r.wait() が機能することを知りたいですか? このコードで:

r.wait()、w.wait()、r.notify()、w.notify() はどのように機能しますか? また、これらは Synchronized(r) / Synchronized(w) とどのように連携するのでしょうか?