如何让其他线程继续锁定 for 循环内的元素 java

How to let other threads to continue on locking elements inside for loop java

假设我有以下代码

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 只是空的 class。我们还假设在这些线程启动之前,我们在 LockingObject 列表中有 100 个对象。 那么,如果线程无法获取当前元素的锁,我该如何让线程继续处理列表中的下一个对象。这样就没有线程(至少在所有对象未被线程锁定之前)在循环内等待。

您可以使用锁:

static List<ReentrantLock> lockObjects;
public static void init(){
   lockObjects = new ArrayList<>(100);
   for(int i = 0; i<100;i++){
      lockObjects.add(new ReentrantLock());
   }
}
@Override
public void run()
{
    for(LockingObject lock : lockObjects)
    {
        if(lock.tryLock()){
           try{ 
              //dostuff
           }finally{
               lock.unlock();
           }

           // break if you only want the thread to work once
           break;
        }
    }

}

如果你的唯一目标是让最多 100 个线程同时工作,你也可以使用 Semaphore 这是一个锁,让多个线程将它锁定到指定值.

尝试使用 Thread.holdsLock(Object obj)

Returns true if and only if the current thread holds the monitor lock on the specified object.

~Thread (Java Platform SE 8)~


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