58

弱参照のCollections.synchronizedList、_componentsがあります。

私は次のようなものを書きました。

public boolean addComponent2(Component e) {
    synchronized (_components) {
        return _components.add(new WeakReference<Component>(e));
    }        
}

しかし、コンパイラは完全に満足しています。List.add()はTRUEを返すことに注意してください。さて、同期されたブロックを終了するとロックが解除されますが、このルックは奇妙ではありませんか?これは、ループでreturnを使用するのと同じように、ブロックの「穴」のようなものです。

このようなコードを維持してよろしいですか?

4

2 に答える 2

65

ループから、またはtry適切なfinallyブロックを持つブロックから戻るのと同じように、それは絶対に問題ありません。セマンティクスに注意する必要があります。その時点で、それは完全に理にかなっています。

それのためにローカル変数を導入するよりも確かに単純なコードです:

// Ick - method body is now more complicated, with no benefit
public boolean addComponent2(Component e) {
    boolean ret;
    synchronized (_components) {
        ret = _components.add(new WeakReference<Component>(e));
    }
    return ret;
}
于 2011-11-01T19:48:04.480 に答える
54

synchronizedブロック内に戻ることには何の問題もありません。ロックは正しく解除されます。

于 2011-11-01T19:46:33.860 に答える