仅针对特定线程的条件代码同步

时间:2013-11-30 21:21:34

标签: java multithreading blocking nonblocking

假设有三组线程。让我们说A,B和C.

我想在A和B类型线程之间发生阻塞的方法中创建代码块,在方法调用的所有情况下都允许使用C线程,包括阻塞部分。

换句话说,如果A类型的线程在阻塞的代码部分中,则B被阻止但C不被阻止。

您是否有可能做到这一点?如果是这样的话怎么办?

2 个答案:

答案 0 :(得分:4)

您可以使用辅助锁定方法:

private final ReentrantLock mLock = new ReentrantLock();

void conditionalLock() {
    ThreadGroup group = Thread.currentThread().getThreadGroup();
    if (group.equals(groupA) || group.equals(groupB)) {
        mLock.lock();
    }
}
编辑更改/简化条件 erickson

void conditionalUnlock() {
    if (mLock.isHeldByCurrentThread()) {
        mLock.unlock();
    }
}

然后,在同一类的方法中:

    conditionalLock();
    try {
        // block you want to synchronize between threads of group A & B
    } finally {
        conditionalUnlock();
    }

答案 1 :(得分:1)

也许这是一种丑陋的方式,但我有一个想法。

您可以为您的Threads命名并执行if语句检查名称(线程类型)。

if (Thread.currentThread().getName().contains("A") || Thread.currentThread().getName().contains("B")){
    synchronized(this){
        //do stuff
    }
}else{
    //do stuff or even check if its type C
}