假设我有以下代码
public class ContinueIfCannotLock implements Runnable
{
static List<LockingObject> lockObjects = new ArrayList();
@Override
public void run()
{
for(LockingObject obj : lockObjects)
{
synchronized ( obj )
{
// do things here
}
}
}
}
而LockingObject是公正和空的类。还假设在这些线程启动之前,LockingObject列表中有100个对象。
因此,如果无法获取当前元素的锁,该如何让线程继续到列表中的下一个对象。这样就没有线程(至少直到所有对象都没有被线程锁定为止)才在循环内等待。
最佳答案
尝试使用Thread.holdsLock(Object obj)
,
static List<LockingObject> lockObjects = new ArrayList();
@Override
public void run(){
for(LockingObject obj : lockObjects){
if(Thread.holdsLock(obj)){
continue; //continue the loop if object is locked.
}
synchronized(obj){
// do things here
}
}
}
}