假设我有以下代码

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
           }
       }
   }
}

10-05 18:57