因此,基本上,如果您具有以下条件,将会发生什么:
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的另一个调用创建的线程),则它必须等待获得锁。然后,它对列表执行所有操作,到达方法的结尾并释放锁。
这里有很多问题:
目前尚不清楚为什么您需要创建自己的线程而不是使用池,或者为什么创建方法需要同步并等待新线程启动才能释放其锁。
SyncTest对象上的锁没有封装,因此其他东西也可以获取它,目前尚不清楚什么东西在争夺该锁。
由于列表被定义为静态类成员,因此您有多个SyncTest对象;您将拥有单独的线程,使同一列表混乱,但是使用了不同的锁,因此很难理解锁的含义。
但是,您所显示的不会死锁。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句