我需要从java中的另一个函数锁定一个函数。在上面的例子中,我调用slave函数来打印计数器。我需要在调用主函数时,所有调用slave函数的线程必须等待主函数结束。
我该怎么做?
int counter = 0;
private void slave()
{
System.out.println(counter);
}
private void master()
{
lockSlave();
counter ++;
unlockSlave();
}
答案 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)
使用同步字,是什么,你可以同步完整的方法,所以只有一个线程可以一次运行。