タグ付けされた質問 「synchronized」



22
Javaで同期(これ)を避けますか?
Javaの同期についての質問がSOに出てくるときはいつでも、synchronized(this)避けなければならないことを非常に熱心に指摘する人もいます。代わりに、プライベートリファレンスのロックが優先されると主張しています。 指定された理由のいくつかは次のとおりです。 いくつかの邪悪なコードがあなたのロックを盗む可能性があります(これは非常に人気があり、「偶然に」変種もあります) 同じクラス内のすべての同期されたメソッドは、まったく同じロックを使用するため、スループットが低下します (不必要に)情報を公開しすぎている 私を含む他の人々synchronized(this)は、それが(Javaライブラリーでも)よく使用されるイディオムであり、安全でよく理解されていると主張します。バグがあり、マルチスレッドプログラムで何が行われているかの手掛かりがないため、これを回避することはできません。つまり、該当する場合はそれを使用します。 私は、ロックオンを回避するthisことが望ましい場合に、ロックオンを回避することが望ましい実際の例(foobarのものではない)をいくつか見ることに興味synchronized(this)があります。 したがって、常に避けsynchronized(this)て、プライベートリファレンスのロックに置き換える必要がありますか? いくつかの詳細情報(回答が提供されると更新されます): インスタンスの同期について話している の暗黙的な(synchronizedメソッド)と明示的な形式のsynchronized(this)両方が考慮されます この件に関してBlochまたは他の当局を引用する場合は、好ましくない部分を省略しないでください(例:効果的なJava、スレッドセーフティの項目:通常はインスタンス自体のロックですが、例外があります)。 synchronized(this)提供以外の細かいロックが必要な場合synchronized(this)は適用されないため、問題はありません。

4
Javaでの揮発性と同期の違い
変数をJava として宣言することとvolatile、常にsynchronized(this)ブロック内の変数にアクセスすることの違いに疑問を感じていますか? この記事http://www.javamex.com/tutorials/synchronization_volatile.shtmlによると、言うべきことがたくさんあり、多くの違いがありますが、いくつかの類似点もあります。 私はこの情報に特に興味があります: ... 揮発性変数へのアクセスがブロックする可能性は決してありません。単純な読み取りまたは書き込みを行うだけなので、同期ブロックとは異なり、ロックを保持することはありません。 volatile変数にアクセスしてもロックは保持されないため、アトミック操作として読み取り、更新、書き込みを行う場合には適していません(「更新を見逃す」準備ができていない限り)。 read-update-writeとはどういう意味ですか?書き込みも更新ではないのですか、それとも単に更新が読み取りに依存する書き込みであることを意味していますか? 何volatileよりも、synchronizedブロックを介して変数にアクセスするよりも、変数を宣言する方が適しているのはいつですか。volatile入力に依存する変数に使用するのは良い考えですか?たとえばrender、レンダリングループを通じて読み取られ、keypressイベントによって設定されるという変数がありますか?

2
Java 8インターフェースメソッドで「同期」が許可されない理由は何ですか?
Java 8では、次のように簡単に記述できます。 interface Interface1 { default void method1() { synchronized (this) { // Something } } static void method2() { synchronized (Interface1.class) { // Something } } } クラスでも使用できる完全な同期セマンティクスを取得します。ただし、synchronizedメソッド宣言では修飾子を使用できません。 interface Interface2 { default synchronized void method1() { // ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here } static synchronized void method2() { …

11
オブジェクトまたはメソッドのJava同期メソッドロック?
同じクラスに2つの同期されたメソッドがあり、それぞれが異なる変数にアクセスしている場合、2つのスレッドがそれらの2つのメソッドに同時にアクセスできますか?ロックはオブジェクトで発生しますか、それとも同期メソッド内の変数と同じくらい具体的になりますか? 例: class X { private int a; private int b; public synchronized void addA(){ a++; } public synchronized void addB(){ b++; } } 2つのスレッドが実行クラスXの同じインスタンスにアクセスすることができますx.addA()とx.addB()同じ時間に?

12
同じクラスで2つのメソッドを同期した場合、それらは同時に実行できますか?
同じクラスで2つのメソッドを同期した場合、同じオブジェクトで同時に実行できますか?例えば: class A { public synchronized void methodA() { //method A } public synchronized void methodB() { // method B } } methodA()2つの異なるスレッドで同じオブジェクトを2回実行することはできません。で同じことmethodB()。 しかし、実行中methodB()に別のスレッドで実行できmethodA()ますか?(同じオブジェクト)

8
Java同期静的メソッド:オブジェクトまたはクラスのロック
Javaのドキュメントは言う: 同じオブジェクト上の同期メソッドの2つの呼び出しをインターリーブすることはできません。 これは静的メソッドにとって何を意味しますか?静的メソッドには関連付けられたオブジェクトがないため、同期されたキーワードはオブジェクトではなくクラスをロックしますか?

3
.classのJava同期ブロック
このJavaコードはどういう意味ですか?それはのすべてのオブジェクトをロックしますMyClassか? synchronized(MyClass.class) { //is all objects of MyClass are thread-safe now ?? } そして、上記のコードがこれとどのように異なるか: synchronized(this) { //is all objects of MyClass are thread-safe now ?? }

8
非最終フィールドの同期
非最終クラスフィールドで同期するたびに警告が表示されます。コードは次のとおりです。 public class X { private Object o; public void setO(Object o) { this.o = o; } public void x() { synchronized (o) // synchronization on a non-final field { } } } だから私は次のようにコーディングを変更しました: public class X { private final Object o; public X() { o = new Object(); } …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.