考虑以下我为测试非原始变量 ( myObject) 的锁定而编写的类。如果所有线程都在同一个对象实例上工作SynchronizationTest,我的问题是:
我知道如果 thread1 正在执行set(...)方法,那么任何其他线程(比如说 thread2)都可以执行anotherSetWithSynchronized(...)或anotherSetWithoutSynchronized(...).
如果thread1
SynchronizationTest在执行时锁定了对象set(...),是否意味着它已经获得了所有成员对象变量的锁定?就像在这种情况下myObject。如果没有那么,如果thread1正在执行
set(...),thread2可以同时执行anotherSetWithSynchronized(...)吗?这两种方法都不能由线程同时执行吗?
这个设计错了吗?我是否需要明确锁定方法
myObject。synchronizedset(...)像这样:public synchronized void set(MyValue myValue) { synchronized (myObject) { myObject.put(myValue); } }
这是我的代码:
public class SynchronizationTest {
private MyObject myObject = new MyObject();
public synchronized void set(MyValue myValue) {
myObject.put(myValue);
}
public void anotherSetWithSynchronized(MyValue myValue) {
synchronized (myObject) {
myObject.put(myValue);
}
}
public void anotherSetWithoutSynchronized(MyValue myValue) {
myObject.put(myValue);
}
}