如何让其他线程继续锁定 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.
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
}
}
}
}
假设我有以下代码
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.
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
}
}
}
}