这在Java 7中诚实地编译和运行
问题是什么 - 虽然在技术上合法,但如果你在某个方法变量上调用synchronized,它实际上是否实现了什么?或者是,因为方法变量存在于他们自己的小世界中,无法实现任何有价值的东西?
例如:
public int getX(){
Integer k = 12;
synchronized (k) {
System.out.println("meow");
}
return x;
}
答案 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>的
现在,假设你的本地值实际上是私有的,那么通常没有必要对它进行同步,我认为如果你尝试,一些分析师会警告你。不过,请参阅here和here了解可能的例外情况。