【问题标题】:ReentrantLock synchronizing getters and settersReentrantLock 同步 getter 和 setter
【发布时间】:2011-12-29 01:05:01
【问题描述】:

假设您有以下代码:

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;
}

哪个是正确的?或者它们是等价的?

【问题讨论】:

    标签: java multithreading concurrency locking reentrantlock


    【解决方案1】:

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

    【讨论】:

    • 不完全正确;据我了解,如果您尝试使用System.exit(int exitcode),finally 将不会被执行...
    • 我认为 System.exit 是一个特例,因为它想立即停止 JVM。
    【解决方案2】:

    它们都工作并且是相同的。第一个是优化的。 看看this,应该会回答你的问题。这个link在第一个链接中说

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

    【讨论】:

      【解决方案3】:
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-29
        • 1970-01-01
        • 2015-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多