你好
我有一个问题与ReentrantReadWriteLocks有关。我正在尝试解决一个问题,即多个读取线程应该能够并行地在数据结构上操作,而一个写入线程只能单独操作(当没有读取线程处于活动状态时)。我正在使用Java中的ReentrantReadWriteLocks来实现这一点,但从时间测量来看,似乎读取线程也会相互锁定。我认为这不应该发生,所以我想知道是否我实现有误。我实现的方式如下:
readingMethod(){
lock.readLock().lock();
do reading ...
lock.readLock().unlock();
}
writingMethod(){
lock.writeLock().lock();
do writing ...
lock.writeLock().unlock();
}
当多个不同的线程调用阅读方法时,从测量时间来看,即使从未调用写入方法,阅读方法也是按顺序执行的!对此有什么想法吗?谢谢您提前致意-干杯
编辑:我尝试提供一个SSCCE,希望这很清楚:
public class Bank {
private Int[] accounts;
public ReadWriteLock lock = new ReentrantReadWriteLock();
// Multiple Threads are doing transactions.
public void transfer(int from, int to, int amount){
lock.readLock().lock(); // Locking read.
// Consider this the do-reading.
synchronized(accounts[from]){
accounts[from] -= amount;
}
synchronized(accounts[to]){
accounts[to] += amount;
}
lock.readLock().unlock(); // Unlocking read.
}
// Only one thread does summation.
public int totalMoney(){
lock.writeLock().lock; // Locking write.
// Consider this the do-writing.
int sum = 0;
for(int i = 0; i < accounts.length; i++){
synchronized(accounts[i]){
sum += accounts[i];
}
}
lock.writeLock().unlock; // Unlocking write.
return sum;
}}
我知道读锁内部的部分实际上不是读取而是写入。我这样做是因为有多个线程执行写操作,而只有一个线程执行读操作,但在读取时,不能对数组进行任何更改。在我的理解中,这种方式可行。再次强调,只要不添加写方法和读锁,读锁内部的代码可以很好地处理多个线程。
synchronized
块,那么你已经回答了这个问题... - Holger