从java中的另一个函数锁定函数

时间:2016-03-29 08:50:45

标签: java locking

我需要从java中的另一个函数锁定一个函数。在上面的例子中,我调用slave函数来打印计数器。我需要在调用主函数时,所有调用slave函数的线程必须等待主函数结束。

我该怎么做?

int counter = 0;

private void slave()
{
  System.out.println(counter);
}

private void master()
{
  lockSlave();
  counter ++;
  unlockSlave();
}

3 个答案:

答案 0 :(得分:2)

看看JDK ReentrantReadWriteLock

private final ReadWriteLock lock = new ReentrantReadWriteLock();

private void slave()
{
    lock.readLock().lock();
    try {
        System.out.println(counter);
        ...
    } finally {
        lock.readLock().unlock();
    }
}

private void master()
{
    lock.writeLock().lock();
    try {
        counter ++;
        ...
    } finally {
        lock.writeLock().unlock();
    }
}

答案 1 :(得分:2)

使用ReentrantReadWriteLock。同时使变量变为volatile,以便所有线程都能看到变化。

ReadWriteLock m_lock = new ReentrantReadWriteLock();
Lock m_readLock = m_lock.readLock();
Lock m_writeLock = m_lock.writeLock();

volatile int counter = 0;

private void slave() {
  m_readLock.lock();
  try {
    System.out.println(counter);
  } finally {
    m_readLock.unlock();
  }
}

private void master(){
  m_writeLock.lock();
  try {
    counter ++;
  } finally {
    m_writeLock.unlock();
  }
}

答案 2 :(得分:-1)

使用同步字,是什么,你可以同步完整的方法,所以只有一个线程可以一次运行。