为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

德玛西亚99 2021-11-17 14:44:17
假设我有以下代码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 个对象。那么,如果线程无法获取当前元素的锁,我该如何让线程继续访问列表中的下一个对象。这样就没有线程(至少在所有对象都没有被线程锁定之前)在循环内等待。
查看完整描述

2 回答

?
繁花不似锦

TA贡献1851条经验 获得超4个赞

尝试使用Thread.holdsLock(Object obj),


当且仅当当前线程持有指定对象的监视器锁时,才返回 true。


~线程 (Java 平台 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

           }

       }

   }

}


查看完整回答
反对 回复 2021-11-17
?
富国沪深

TA贡献1790条经验 获得超9个赞

您可以使用锁:


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 个线程同时工作,您还可以使用 aSemaphore这是一个锁,让多个线程将其锁定到指定值。


查看完整回答
反对 回复 2021-11-17
  • 2 回答
  • 0 关注
  • 264 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信