ReentrantLock синхронизирует геттеры и сеттеры - PullRequest
4 голосов
/ 15 ноября 2011

Допустим, у вас есть следующий код:

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 ]

6 голосов
/ 15 ноября 2011

Они эквивалентны.Все, что находится в блоке finally, выполняется независимо от выхода из блока (например, управление потоком снизу, оператор возврата или исключение).

1 голос
/ 15 ноября 2011

Они оба работают и одинаковы.Первый оптимизирован, хотя.Посмотрите на this , и это должно ответить на ваш вопрос.и эта ссылка в первой ссылке, которая гласит:

копирование в локальные системы, дает наименьший байт-код, а для низкоуровневого кода неплохо написать код, который немного ближе к машине

0 голосов
/ 15 ноября 2011

Я пойду к первому, который поддерживает чистоту и порядок подписи получателя (без параметров).Я бы добавил туда небольшой комментарий, чтобы документировать тот факт, что блок finally всегда выполняется.Для справки, я фактически однажды получил один и тот же вопрос от своего коллеги, с этого момента и всегда я стараюсь комментировать этот вид кодирования, чтобы сэкономить время на поиск в Google моих читателей кода.

0 голосов
/ 15 ноября 2011
...