4

我正在尝试解决一个问题,这是否可行或不尝试与该论坛中的专家一起了解,问题在于使用 java 进行线程间通信。

我有一堂课:

class A {
    public void setX() {}
    public void setY() {}
}

我有 4 个或更多线程,例如:

T1,T2,T3,T4 are the threads that operates on this Class

如果线程正在设置一种方法,所有其他线程都将在其他方法上操作,我必须以这种方式设计同步

例如:

if thread T1 is operating on setX() methods then T2,T3,T4 can work on setY()
if thread T2 is operating on setX() methods then T1,T3,T4 can work on setY()
if thread T3 is operating on setX() methods then T1,T2,T4 can work on setY()
if thread T4 is operating on setX() methods then T1,T2,T3 can work on setY()
4

2 回答 2

9

您将不得不在外部执行此操作。

在实例ReentrantLock之间共享一个。Runnable

A a = new A();
ReentrantLock lock = new ReentrantLock();
...
// in each run() 
if (lock.tryLock()) {
    try {
        a.setX(); // might require further synchronization
    } finally {
        lock.unlock();
    }
} else {
    a.setY(); // might require further synchronization 
}

相应地处理Exceptions。运行时tryLock()返回

如果锁是空闲的并且被当前线程获取,或者锁已经被当前线程持有,则返回 true;否则为假

它立即返回,不涉及阻塞。如果返回false,您可以使用其他方法。完成操作后,您不能忘记释放锁定setX()

于 2013-10-11T18:33:55.000 回答
3

好问题。您可以使用tryLock

您应该执行以下操作:

class A
{
   public void setX() {
        if (tryLock(m_lock))
        {
           // Your stuff here
        } else {
           setY();
        }

   }
   public void setY() {
        // Your stuff here
   }
}
于 2013-10-11T18:36:08.667 回答