4

次のコードがあるとします。

public int getSpeedX() {
    speedLock.lock();
    try {
        return speedX;
    } finally {
        speedLock.unlock();
    }
}

public void setSpeedX(int x) {
    speedLock.lock();
    try {
        speedX = x;
    } finally {
        speedLock.unlock();
    }
}

リターンスピードXは大丈夫ですか?または、次のようにする必要があります。

public int getSpeedX() {
    int temp;
    speedLock.lock();
    try {
        temp = speedX;
    } finally {
        speedLock.unlock();
    }
    return temp;
}

どちらが正しい?それとも同等ですか?

4

4 に答える 4

6

それらは同等です。finallyブロックがどのように終了したかに関係なく、ブロック内のすべてが実行されます (例: 一番下のフロー制御、return ステートメント、または例外)。

于 2011-11-14T21:58:17.363 に答える
1

それらは両方とも機能し、同じです。ただし、最初のものは最適化されています。これを見てください、そしてそれはあなたの質問に答えるはずです。と言う最初のリンクのこのリンク

ローカルにコピーすると最小のバイトコードが生成されます。低レベルのコードの場合は、マシンに少し近いコードを作成すると便利です。

于 2011-11-14T22:01:32.063 に答える
0

java.util.concurrent.locks.ReentrantReadWriteLock

http://download.oracle.com/javase/1,5,0/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html

于 2011-11-14T22:02:15.087 に答える
0

getter 署名をきれいに整頓する (パラメーターなし) 最初のものを使用します。finallyブロックが常に実行されるという事実を文書化するために、そこに小さなコメントを入れます。記録のために、私は実際に私の同僚からまったく同じ質問を一度受けました.

于 2011-11-14T22:14:23.167 に答える