能否安全地同步 Java 方法参数?
2022-09-02 01:54:01
取此代码:
public class MyClass {
private final Object _lock = new Object();
private final MyMutableClass _mutableObject = new MyMutableClass()
public void myMethod() {
synchronized(_lock) { // we are synchronizing on instance variable _lock
// do something with mutableVar
//(i.e. call a "set" method on _mutableObject)
}
}
}
现在,想象一下将 myMethod() 中的代码委托给某个帮助程序类,在那里你传递了锁。
public class HelperClass {
public helperMethod(Object lockVar, MyMutableClass mutableVar) {
synchronized(lockVar) { // we are now synchronizing on a method param,
// each thread has own copy
// do something with mutableVar
// (i.e. call a "set" method on mutableVar)
}
}
}
是否可以通过传递其锁变量来重写“myMethod”以使用HelperClass,以便一切都是线程安全的?即
public void myMethod() {
_helperObject.helperMethod(_lock, _mutableObject);
}
我不确定这一点,因为Java将按值传递lockVar,并且每个线程都将获得lockVar的单独副本(即使每个副本都指向堆上的同一对象)。我想问题归结为“synchronized”关键字的工作原理 - 它是否锁定了变量,还是锁定了变量引用的堆上的值?