問題タブ [synchronized]
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 - 複数のスレッドがクラス フィールドに安全にアクセスできるようにするにはどうすればよいでしょうか?
複数のスレッドが getter メソッドを介してクラス フィールドにアクセスする場合、スレッド セーフをどのように維持しますか? 同期されたキーワードで十分ですか?
これは安全ですか:
または、セッターはさらに複雑になりますか?
java - Java での String オブジェクトの同期
特に、数百人のユーザーが同じページにアクセスし、このページで約 10 秒ごとに更新を行うことが予想される機能について、いくつかの負荷/パフォーマンス テストを行っている Web アプリケーションがあります。この関数を使用して改善できることがわかった領域の 1 つは、データが変更されないため、Web サービスからの応答を一定期間キャッシュすることでした。
この基本的なキャッシングを実装した後、さらにいくつかのテストを行ったところ、並行スレッドが同時にキャッシュにアクセスする方法を考慮していないことがわかりました。約 100 ミリ秒以内に、約 50 のスレッドがキャッシュからオブジェクトをフェッチしようとしていて、有効期限が切れていることを発見し、Web サービスにアクセスしてデータをフェッチし、オブジェクトをキャッシュに戻していることがわかりました。
元のコードは次のようになります。
したがって、オブジェクトの有効期限が切れたときに 1 つのスレッドだけが Web サービスを呼び出していることを確認するにはkey
、キャッシュの get/set 操作を同期する必要があると考えました。同期します (この方法では、電子メール b@b.com に対するこのメソッドへの呼び出しは、a@a.com へのメソッド呼び出しによってブロックされません)。
メソッドを次のように更新しました。
また、「同期ブロックの前」、「同期ブロックの内側」、「同期ブロックを離れようとしています」、「同期ブロックの後」などのログ行を追加したので、get/set 操作を効果的に同期しているかどうかを判断できました。
ただし、これが機能しているようには見えません。テスト ログには次のような出力があります。
get/set 操作の前後で同期ブロックに出入りするスレッドを一度に 1 つだけ見たかったのです。
String オブジェクトの同期に問題はありますか? キャッシュキーは操作に固有であるため、良い選択だとfinal String key
思いました。メソッド内で宣言されていても、各スレッドが同じオブジェクトへの参照を取得するため、これで同期されると考えていました単一のオブジェクト。
ここで何が間違っていますか?
更新: ログをさらに調べたところ、次のように、キーが常に同じである同じ同期ロジックを持つメソッドのようです。
同じ並行性の問題は発生しません。一度に 1 つのスレッドだけがブロックに入ります。
更新 2 : 助けてくれてありがとう! ing Stringsに関する最初の回答を受け入れましたintern()
。これにより、最初の問題が解決されました。複数のスレッドが同期ブロックに入るべきではないと思っていた場所に、key
の値が同じであるためです。
他の人が指摘しているintern()
ように、そのような目的で使用し、それらの文字列を同期することは、実際には悪い考えであることが判明しました.webappに対してJMeterテストを実行して予想される負荷をシミュレートすると、使用されるヒープサイズが20分弱。
現在、メソッド全体を同期するだけの単純なソリューションを使用していますが、martinprobst と MBCook が提供するコード サンプルが非常に気に入っていますが、現在、このクラスには約 7 つの同様のメソッドgetData()
があるため (約 7 つの異なるデータが必要なため)ロックの取得と解放に関するほとんど重複したロジックを各メソッドに追加したくありませんでした。しかし、これは間違いなく、将来の使用にとって非常に価値のある情報です。これらは、このようなスレッドセーフな操作を行うための最善の方法に関する最終的な正解だと思います。できれば、これらの回答にもっと投票したいと思います!
java - Java Web アプリケーションの同期に関する質問
クラス「Foo」と呼ばれる Web アプリにクラスがあるとします。Spring を使用して Bean を作成するときに呼び出される initialise() メソッドがあります。次に、initialise() メソッドは、外部サービスをロードしてフィールドに割り当てようとします。サービスに接続できなかった場合、フィールドは null に設定されます。
誰かがクラス「Foo」で get() メソッドを呼び出すと、initialise() メソッドでサービスが開始されていれば、サービスが呼び出されます。サービスのフィールドが null の場合、外部サービスをロードしてみます。
このようなことをすると、同期の問題が発生する可能性はありますか?
java - 同期のデッドロック ( String intern())
私はSun jdk 1.5 ThreadPoolExecutor(24、24,60、TimeUnit.SECONDS、新しいLinkedBlockingQueue())を使用しています。soemtime jdbツールを使用して、スレッドプール内のすべてのスレッドのステータスが「モニターで待機中」であることを確認します。コードは次のとおりです。
"synchronized (key.intern()) " に問題はありますか?
jdb ツールを使用して次の情報を取得します。24 スレッドのステータスは「モニターで待機中」です。これは、24 スレッドが「key.intern()」でデッドロックしていることを意味します。
(java.lang.Thread)0x28 pool-3-thread-2 モニターで待機中
(java.lang.Thread)0x27 pool-3-thread-3 モニターで待機中
(java.lang.Thread)0x1b pool-3-thread-4 モニターで待機中
(java.lang.Thread)0x1a pool-3-thread-5 モニターで待機中
(java.lang.Thread)0x19 pool-3-thread-6 モニターで待機中
(java.lang.Thread)0x18 pool-3-thread-7 モニターで待機中
(java.lang.Thread)0x17 pool-3-thread-8 モニターで待機中 ...
結果は次のとおりです。マルチスレッド環境では、Sting intern() メソッドがデッドロックになる可能性があります。
java - Java クリティカル セクションでは、何を同期する必要がありますか?
Java では、コード内でクリティカル セクションを宣言する慣用的な方法は次のとおりです。
ほとんどすべてのブロックが で同期されます this
が、これには特別な理由がありますか? 他の可能性はありますか?同期するオブジェクトに関するベスト プラクティスはありますか? Object
( ?のプライベート インスタンスなど)
java - Java 同期静的メソッド: オブジェクトまたはクラスのロック
Javaのドキュメントには次のように書かれています:
同じオブジェクトに対する同期メソッドの 2 つの呼び出しをインターリーブすることはできません。
これは静的メソッドにとって何を意味するのでしょうか? 静的メソッドには関連付けられたオブジェクトがないため、synchronized キーワードはオブジェクトではなくクラスをロックしますか?
java - Javaで同期(これ)を避けますか?
synchronized(this)
Java同期についてSOに質問が出たときはいつでも、避けるべきだと非常に熱心に指摘する人もいます。代わりに、彼らは、プライベート参照のロックが優先されると主張しています。
与えられた理由のいくつかは次のとおりです。
- いくつかの邪悪なコードがあなたのロックを盗むかもしれません(これは非常に人気があり、「偶然に」バリアントもあります)
- 同じクラス内のすべての同期メソッドはまったく同じロックを使用するため、スループットが低下します
- あなたは(不必要に)あまりにも多くの情報を公開しています
私を含む他の人々は、これsynchronized(this)
は(Javaライブラリでも)頻繁に使用されるイディオムであり、安全でよく理解されていると主張しています。バグがあり、マルチスレッドプログラムで何が起こっているのか見当がつかないため、回避すべきではありません。言い換えれば、それが該当する場合は、それを使用します。
私はいくつかの実際の例(foobarのものはありません)を見ることに興味があります。そこでは、ロックオンを回避するthis
ことが望ましい場合synchronized(this)
もあります。
したがって、常に回避synchronized(this)
して、プライベート参照のロックに置き換える必要がありますか?
いくつかのさらなる情報(答えが与えられると更新されます):
- インスタンスの同期について話している
- の暗黙的(
synchronized
メソッド)と明示的形式のsynchronized(this)
両方が考慮されます - この件についてBlochまたは他の当局を引用する場合は、気に入らない部分を省略しないでください(たとえば、Effective Java、スレッドセーフの項目:通常はインスタンス自体のロックですが、例外があります)。
synchronized(this)
提供する以外のロックの粒度が必要な場合synchronized(this)
は適用されないため、問題にはなりません
flash - 保存された Flash ビデオを複数の人に同期してストリーミングする方法はありますか?
Flash ビデオ ストリーミング ソリューションの展開についてよく知りません。Flash で次のことが実現できるかどうか知りたいです。
複数の人が同時にビデオを視聴できるアプリケーションを作成していますが、そのうちの 1 人が全員のビデオの再生を制御しています。さらに、管理者は常に同じ人ではなく、誰かが去ったり、他の要因によって変わる可能性があります。
私を正しい方向に向けてください。
ありがとう!
java - 同期ブロックの代わりに同期メソッドを使用する利点はありますか?
例を挙げて、同期ブロックに対する同期メソッドの利点を教えてもらえますか?
java - HttpSession はスレッド セーフですか? set/get Attribute はスレッド セーフ操作ですか?
また、セッションに保存されているオブジェクトの状態がわかっていることを保証するために、設定されているオブジェクトはスレッドセーフである必要がありますか。
また、私はウェブ上で次の使用を提案していることを読んでいました。
これは有効な提案ですか?