0

簡単な質問がありますが、答えを見つけるのに問題があります。

問題は、同期メソッドが同期(this) と等しいかどうかです-同じロックを行うことを意味します。

スレッド ロックを減らしたスレッド セーフなコードを書きたい (常に同期されたメソッドを使用するのではなく、部分的な同期クリティカル セクションのみを使用する場合がある)。

このコードが等しいかどうか、またその理由を短い言葉で説明していただけますか (例はアトミックな問題を示すために単純化されています)。

この混合ロック コードは、以下のブルート フォース コードと同じですか。

public class SynchroMixed {
    int counter = 0;

    synchronized void writer() {
        // some not locked code
        int newCounter = counter + 1;

        // critical section
        synchronized(this) {
            counter = newCounter;
        }
    }

    synchronized int reader() {
        return counter;
    }
}

ブルート フォース コード (各メソッドは、重要でないセクションを含めてロックされています。

public class SynchroSame {
    int counter = 0;

    synchronized void writer() {
        int newCounter = counter + 1;

        counter = newCounter;
    }

    synchronized int reader() {
        return counter;
    }
}

または、このコードを作成する必要があります (これは確かに有効ですが、よりマイクロコーディングで不明確です)。

public class SynchroMicro {
    int counter = 0;

    void writer() {
        // some not locked code
        int newCounter = counter + 1;

        // critical section
        synchronized(this) {
            counter = newCounter;
        }
    }

    int reader() {
        synchronized (this) {
            return counter;
        }
    }
}
4

4 に答える 4

3

synchronizedメソッドとsynchronized(this)はまったく同じことを意味し、背後で同じミューテックスを使用します。どの表記法を好むかは、味の問題です。

個人synchronized(this)的には、メソッド全体よりも小さい可能性のあるミューテックスロックのスコープを明示的に指定しているため、私は好みます

于 2013-03-13T11:18:34.853 に答える
2

同期メソッドとブロックは、機能的な観点からはまったく同じです。どちらも同じタスクを実行します。つまり、特定のメソッドまたはメソッド内のコード ブロックへの同時アクセスを回避します。

Synchronized() ブロックは、長いメソッドがあり、その一部だけを同期する必要がある場合に、より柔軟で便利です。メソッド全体へのアクセスをロックする必要はありません。同期にはパフォーマンスの問題が伴うことがわかっているからです。したがって、メソッド全体ではなく、コードの必要な部分のみを同期することを常にお勧めします (必要でない場合)。

于 2013-03-13T12:59:50.953 に答える