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