ReentrantLock同步getter和setter

时间:2011-11-14 21:51:28

标签: java multithreading concurrency locking reentrantlock

假设您有以下代码:

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 个答案:

答案 0 :(得分:6)

它们是等价的。无论块退出的方式如何(例如流控制输出底部,返回语句或异常),都会执行finally块中的任何内容。

答案 1 :(得分:1)

它们既有效又相同。第一个是优化的。 看看this,这应该回答你的问题。并在第一个链接中显示<{p}} link

  

复制到本地生成最小的字节码,对于低级代码,编写更接近机器的代码是很好的

答案 2 :(得分:0)

答案 3 :(得分:0)

我将选择第一个保持getter签名干净整洁(无参数)的方法。 我会在那里写一个小注释来记录finally块总是被执行的事实。 为了记录,我实际上从我的同事那里得到了完全相同的问题,从那时起,我总是尝试评论这种编码以节省我的代码阅读器的一些谷歌搜索时间。