問題タブ [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 - .class の Java 同期ブロック
このJavaコードはどういう意味ですか? のすべてのオブジェクトをロックしますMyClass
か?
そして、上記のコードがこのコードとどのように異なるか:
java - Javaの最終変数と同期ブロック
Javaの最終変数とは何ですか? たとえばfinal int temp;
、関数で記述した場合、final キーワードの意味は何ですか?
また、いつ final 変数を (クラス変数と関数変数の両方として) 使用したいですか?
同期ブロック内の変数を final と宣言する必要があるのはなぜですか?
java - ロックとしてのオブジェクトとバイト[0]
この質問(「なぜ java.lang.Object は抽象的ではないのですか?」)について以前にコメントしましたbyte[0]
が、 をロックとして使用する方がjava.lang.Object
. これをどこかで読んだことはあると思いますが、どこだったか思い出せません。これが本当かどうか知っている人はいますか?
長さフィールドを格納するために追加のストレージが必要であることが指摘されていたため、これは利点を無効にする可能性があると指摘されていましたが、byte[0]
よりもわずかに少ないバイトコードを必要とするインスタンス化が原因であると思われます。Object
byte[0]
hibernate - 春のトランザクションは同期されたメソッドの同期を解除できますか?
私の同僚と私は、MyEclipse 内の Tomcat で Spring 3.0.0 と JPA (hibernate 3.5.0-Beta2) を使用する Web アプリケーションを持っています。データ構造の 1 つがツリーです。ふざけて、JMeter で「ノードの挿入」操作のストレス テストを試みたところ、同時実行性の問題が見つかりました。Hibernate は、次のような警告の直後に、同じ秘密鍵を持つ 2 つのエンティティを見つけたことを報告します。
複数のスレッドが同時に insert() メソッドを呼び出すと、このような問題がどのように発生するかを簡単に確認できます。
私のサーブレット A は、サービス層オブジェクト B.execute() を呼び出し、それが下位層オブジェクト C.insert() を呼び出します。(実際のコードは掲載するには大きすぎるため、多少簡略化しています。)
サーブレット A:
サービス B:
サブサービス C:
すべての状態変更呼び出しは B を経由するため、 B.execute() を作成することにしましたsynchronized
。それはすでに でしたが@Transactional
、実際には永続性だけでなく、同期する必要があるのはビジネス ロジックであるため、それは合理的に思えます。
私の C.insert() メソッドも@Transactional
. しかし、Spring のデフォルトのトランザクションの伝播は Required のようですので、C.insert() 用に作成された新しいトランザクションはなかったと思います。
コンポーネント A、B、および C はすべて spring-bean であるため、シングルトンです。実際に B オブジェクトが 1 つしかない場合、一度に複数の脅威が b.execute() を実行することはできないはずだと結論付けます。負荷が軽いときはシングルスレッドしか使用されず、これが当てはまります。しかし、負荷がかかると、追加のスレッドが関与し、最初のスレッドが「終了」を出力する前に、いくつかのスレッドが「開始」を出力します。synchronized
これはメソッドの性質に違反しているようです。
this
B オブジェクトが 1 つしかないかどうかを確認するために、ログ メッセージに を出力することにしました。すべてのログ メッセージは、同じオブジェクト ID を示しています。
非常にイライラする調査の結果、@Transactional
for B.execute() を削除すると問題が解決することがわかりました。その行がなくなると、多くのスレッドを作成できますが、次の「開始」の前に「開始」に続いて「終了」が常に表示されます (データ構造はそのまま残ります)。どういうわけか、が存在しないsynchronized
場合にのみ機能するよう@Transactional
です。しかし、私はその理由を理解していません。誰でも助けることができますか?これをさらに調べる方法に関するヒントはありますか?
スタック トレースでは、A.doPost() と B.execute() の間、および B.execute() と C.insert() の間に aop/cglib プロキシが生成されていることがわかります。どういうわけか、プロキシの構築がsynchronized
動作を台無しにするのではないかと思います。
java - Java での同期のヘルプ
http://download.eclipse.org/jetty/stable-7/xref/com/acme/ChatServlet.htmlを見ると、同期メソッドに同期ブロックが必要な理由がわかりません。 :
メソッド全体がすでにスレッドセーフであるのに、なぜm
同期する必要があるのですか?
洞察をありがとう。
java - Java でカプセル化されたスレッドセーフなデータ構造へのアクセスを同期する必要がありますか?
私はこのようなものを持っているとしましょう(そして私は持っています)
これらのいくつかは独自のスレッドで実行されます
私poll()
はいるQueBean
べきsynchronized
かどうか?
java - Collection.synchronizedMapとHashMapの個々のメソッドの同期
Collections.synchronizedMap()と、すべてのメソッドが同期されたHashMapのラッパーの違いは何ですか。Collections.synchronizedMap()がすべてのメソッドに対して内部的に同じロックを維持しているため、違いはわかりません。
基本的に、次のコードスニペットの違いは何ですか
と
java - Java 同期に関する質問
同期の側面を見て、いくつかのコード スニペットを調べていました。オブジェクトでロックが発生すると思います。Java の場合、オブジェクトへの参照しかありません。Java は参照を使用してオブジェクトを取得し、ロックする必要があります。
参照が null の場合はどうなりますか? これは壊れそうな予感。これが機能する場合は、参照でもロックを行う必要があります (これは私を打ち負かします)。誰かが私のためにこれを明確にすることができます.
java - イテレータ同時変更例外
リストが doSomething() で変更された場合、このコードは同時変更例外をスローします。コードを同期ブロックで囲むことで回避することは可能ですか?
java - Java RMI とスレッド同期に関する質問
Java RMI とスレッド同期について、実際に 2 つの質問があります。
1) RMI リモート メソッドを同期として実装した場合、それらは相互に排他的であることが保証されますか? RMI メソッド (クライアントに提供されるメソッド) が 2 つ同時に実行されないようにする必要があります。
2) サーバーが定期的に実行するメソッドがあります。クリーンアップを行うために使用されます。リモートクライアントによって実行/使用されているRMIメソッドがある場合、この特定のメソッドが実行されないようにする必要があります。また、そのメソッドが実行されているときは、RMI 呼び出しができないはずです。つまり、クライアントは待機する必要があります。どうすればそれを行うことができますか?ロックについて読んだことがありますが、このシナリオでロックを使用する方法がわかりません。
RMI メソッドを静的に実装し、そのクリーンアップ メソッドを RMI インターフェイス内に含めることを検討しましたが、問題を解決するエレガントな方法ではないようです。
また、RMI インターフェイス内のクリーンアップ メソッドを同期として記述しました。テストのために実行したところ、メソッド間に衝突はないように見えましたが、確信が持てません。
お時間とご回答ありがとうございます。