問題タブ [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 投票する
3 に答える
545 参照

java - 同期ブロックで宣言されたアクセスできない変数 - Java

このコードはコンパイルされません:

それでも、理由はわかりません.同期ブロックは常に最終的に実行されるというのが私の理解だったので、同期ブロックに続くコードは、新しく宣言された変数を認識していると思います。どこが間違っていますか?

0 投票する
3 に答える
982 参照

java - Javaスレッド:同期されたブロック

同期されたブロックを確実に理解するために、いくつかの助けが必要です。次の例を想定します。

私の質問は、安全のために、ThreadAのキューオブジェクト全体を同期してオブジェクトをキュークラスに送信するだけで十分ですか?ThreadBでも同じことを行って、キューからオブジェクトを削除しました。または、QueueクラスのsubmitObject()メソッドとdeleteObject()メソッドも同期する必要がありますか?

私の理解では、上記のようにQueueクラス全体をスレッドにロックすると、安全な側にいるはずです-そうですか?

greetZと事前に感謝します。

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

java-me - Java で cancelInquiry を呼び出して、一部の Nokia 携帯電話で Bluetooth の問い合わせをキャンセルすると、コードがハングするのはなぜですか?

S40を搭載したNokiaデバイスで問題があります(S60では問題ありません)。問題は次のとおりです。同期ブロック内から DiscoveryAgent の cancelInquiry メソッドを呼び出すと、ハングします。実際には、inquiryCompleted をコールバックすることになっています。コードがフリーズするだけで、inquiryCompleted メソッドに入ることはありません。同じことが行われているが、同期されたブロック内からではない場合 - すべてが機能します。問題は、ブロック内のすべてがマルチスレッドアプリでアトミックに実行されるように、ブロックを同期する必要があることです。

これは私の DiscoveryListener がどのように見えるかです:

上記のコードを s40 と s60 の両方で、同期ステートメントをコメントアウトして実行し、cancel() メソッドを呼び出すと、inquiryCompleted メソッドがすぐに呼び出され、ビープ音が聞こえます。ただし、同期ステートメントのコメントを外すと、S60 ではビープ音が聞こえますが、S40 (少なくとも第 5 版 fp1) では、inquiryCompleted は呼び出されません! (discoveryAgentのcancelInquiryを呼び出す直前にビープ音を鳴らしたとき、ビープ音を鳴らしました。その呼び出しの後に配置したとき、そこに到達しませんでした。これは、inquiryCompletedを呼び出すまで呼び出しが返されず、その呼び出しが発生しないためです)

何が問題ですか?S40 の cancelInquiry の impl'n のバグである場合、どうすれば回避できますか? 物事は並行して行われるため、同期する必要があります (たとえば、私のコードは照会を開始し、その後、それをキャンセルする場合があります。キャンセルされた時点で、startInquiry が実行されている可能性があり、deviceDiscovered が実行されている可能性があり、inquiryCompleted が実行されている可能性があります。もちろん、これらのいずれかと並行して、着信 cancelInquiry が実行されている可能性があります。

InquiryCompleted を別のリスナー インスタンスに分離しようとしました。つまり、discoveryAgent.cancelInquiry(this) を呼び出す代わりに、discoveryAgent.cancelInquiry(anotherInstance) を呼び出しました方法も。

助言がありますか?前もって感謝します

0 投票する
3 に答える
424 参照

java - 戻り値が同期ブロックの外で宣言/返される場合、メソッドはスレッドセーフですか?

fooは同期ブロックの外で宣言されているため、不正なデータを返す可能性はありますか?

0 投票する
4 に答える
1674 参照

java - スレッドの同期時に WebMethods がブロックされるのはなぜですか?

JAX-WS Web サービスのコード例を参照してください。

}

WebMethod が 2 回呼び出された場合、2 番目の呼び出しはスレッド X が完了するのを待っています。なぜですか?

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

java - 同期されたブロック:他の変数の「内部」にある変数が更新されます

技術的でないタイトルで申し訳ありませんが、それは私の質問をうまく要約していると思います。私が正しく読んだものを解釈すると、同期ブロックは(他の結果を除いて)すべての変数をメインメモリとの間で更新します(同期ブロック内で明示的にアクセスされていない変数でも、それらの「親」のみ?) 。たとえば、このスタックオーバーフローの質問の答えを引用します(私はそれを文脈から外しました、後でそれに戻ります):

メモリバリアは、無関係なものも含め、すべてのメモリ参照に適用されます。

これを正しく解釈できるかどうかの確認が必要です。私は2つのスレッド(threadA、threadB)を持っています。次のコードを検討してください。

getterB()ThreadBから呼び出され、ThreadAinitA()から呼び出さoperationA()れます。(これは、 ThreadBが作成される前でも呼び出されるため、同時実行されることに注意してください。)また、配列のコピーを返さないのには十分な理由があることに注意してください(いいえ、threadBはその要素を変更したくないので、理由は、現在は関係のない私のソフトウェアの外部要件です)。initA()getterB()operationA()getterB()

threadBはこれを行います:

ご覧のとおり、ではgetterB()、参照のみがanArrayメモリバリア内でアクセスされ、配列値自体にはアクセスされません。私の質問:

  1. threadBは最新の配列要素値を参照しますか?(つまり、要素自体もメインメモリから更新されていgetterB()ますか?)

  2. 引用されたステートメントは、無関係のキャッシュされたコピーがメインメモリからも更新されると述べています。私はこれを100%無関係に解釈する方法ではありません(ロックに使用される変数とは無関係ですか?または同期されたブロック全体とは無関係ですか?)。私は引用を文脈から外したことを知っています、そしてそれは別のスタックオーバーフローの質問なので、そこにコメントを追加しました。ですから、私の質問がそこで(またはここで-私は気にしません)答えられれば幸いです。

  3. anArrayオブジェクトの配列(プリミティブ型ではない)の場合、答えに違いはありますか?さらに進んで、それが配列ではなく、他のクラスへの参照を含むクラスである場合はどうなるでしょうか。(つまり、他のオブジェクトを参照するオブジェクトであり、によって返されたオブジェクトを介して含まれているオブジェクトにアクセスしますgetterB())。threadBは、これらの含まれている参照の最新のコピーを使用しますか、それとも 独自のローカルキャッシュコピーを使用しますか(コンテナオブジェクトのみを更新し、含まれている参照自体は更新しないため)。getterB()

0 投票する
3 に答える
625 参照

java - このコードは IllegalMonitorStateException をスローする可能性があります

このメソッドは IllegalMonitorStateException をスローします。誰かがその理由を説明できますか。

前もって感謝します

0 投票する
3 に答える
114 参照

java - 同期されたアクセスされたメソッドを同期する必要がありますか?

synchronizedブロック内からメソッドにアクセスしたい。次に例を示します。

doSequentialStuffきれいなコードを書くには、メソッドを明示的に作成するのがよいのではないかと考えましたsynchronized。ロックは両方の場合にあり、メソッドはブロックthisからのみアクセスされることが保証されているため、これはセマンティックに違いはありません。synchronized可読性を高めたいと考えています。

何かアドバイス?

編集: コメントを組み込むために例を修正しました。

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

java - 同時実行例外

run() メソッドで ConccurentModificationException を取得しています。私は次のことを試しましたが、うまくいきませんでした:

0 投票する
3 に答える
224 参照

java - Java の同期とコレクション

同期されたコード ブロックに非同期コレクションが含まれている場合。コレクションはスレッドセーフと見なされますか? そうでない場合、2 つのスレッドが同期されたコード内のコレクションに安全にアクセスできないという実用的なシナリオを提供できますか?

ありがとう。