你能在方法变量上调用synchronized吗?

时间:2016-12-23 18:50:21

标签: java multithreading

这在Java 7中诚实地编译和运行

问题是什么 - 虽然在技术上合法,但如果你在某个方法变量上调用synchronized,它实际上是否实现了什么?或者是,因为方法变量存在于他们自己的小世界中,无法实现任何有价值的东西?

例如:

public int getX(){
    Integer k = 12;
    synchronized (k) {
        System.out.println("meow");
    }
    return x;
}

1 个答案:

答案 0 :(得分:2)

你问错了问题。 变量是否是本地的是无关紧要的,如以下示例所示:

class Test {
    private Map<String, String> map = new HashMap<>();

    public void put(String key, String value) {
        Map<String, String> localMap = this.map;
        synchronized (localMap) {
            localMap.put(key, value);
        }
    }
}

如果您在synchronized区块内有可能替换该字段,则实际需要本地参考。

所以真正的问题是你是否应该锁定私有,即其他线程无法使用的对象。您可能认为您的示例演示了这种情况,但根据JLS,自动装箱的Integer 12被缓存,这意味着您实际上正在同步全局值< / em>的

现在,假设你的本地值实际上是私有的,那么通常没有必要对它进行同步,我认为如果你尝试,一些分析师会警告你。不过,请参阅herehere了解可能的例外情况。