2

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

public void doSomething() {
    // simple stuff

    // a block to reduce the synchronized code to
    // what really needs to be synchronized.
    synchronized(this) {
        if (precondition) {
            doSequentialStuff();
        }
    }
}

private void doSequentialStuff() {
    // do stuff needs to be performed sequentially.
}

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

何かアドバイス?

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

4

3 に答える 3

3

doHeavyStuffロックを保持せずに実行できる正当なコード パスがない場合は、不注意な開発者によって導入される将来のバグを先取りするために、必ずそれを作成してくださいsynchronizedコードの可読性は、どのような方法でも改善できます。

于 2013-01-02T11:23:33.083 に答える
1

ロックが保持されていることを確認するには、アサートを使用することをお勧めします。チェックを実行するには、アサーションを有効にする必要があることに注意してください。

assert Thread.holdsLock(this);

一般に、この種のプライベート メソッドを使用している場合、クラスを 2 つに分割する必要があることを示す傾向があります。外側の層はロックや、おそらくクライアントに適したその他のことを行いますが、より深い層は実装に関係しています。

thisロックするための の使用は疑わしいです。一般に、プライベートな明示的なロック オブジェクトを使用することをお勧めします。

于 2013-01-02T11:17:01.127 に答える
0

http://weblogs.java.net/blog/mason/archive/2006/09/rechecking_doub.htmlを見てください。同様のパターンがカバーされています(例としてシングルトンを使用していますが、ケースに合わせて簡単に改造できます)。

于 2013-01-02T11:17:01.453 に答える