因此,基本上,如果您具有以下条件,将会发生什么:
class SyncTest {
private final static List<Object> mObjectList = new ArrayList<Object>();
public synchronized void mySyncMethod(Object object) {
new Thread(new Runnable() {
public void run() {
synchronized (SyncTest.this) {
for (int i = 0; i < mObjectList.size(); i++) {
//Do something with object
}
}
}
}).start();
}
}
最佳答案
重新入场不适用于这里。嵌套的唯一影响是允许内部类实例访问封闭的实例(包括所使用的锁)。同步的两件事在不同的线程中调用。一旦创建了新线程,调度程序就必须先选择它才能运行,因此即使这些线程使用相同的锁,这似乎也不大可能在两者之间有很多重叠。
调用mySyncMethod的线程获取正在使用的SyncTest实例上的锁,然后创建一个新的Thread,启动它,然后释放该锁并继续进行。
之后,新线程启动后,它必须先获取启动它的SyncTest对象的锁,然后才能执行其run方法。如果其他人正在使用SyncTest上的锁(要么是刚刚创建它的线程,另一个在同一SyncTest实例上对mySyncMethod的调用,或者另一个在同一SyncTest实例上对mySyncMethod的另一个调用创建的线程),则它必须等待获得锁。然后,它对列表执行所有操作,到达方法的最后并释放锁。
这里有很多问题:
但是,您所显示的不会死锁。