【发布时间】:2009-09-25 10:34:20
【问题描述】:
如果我在多线程应用程序中有一个数据结构,我想在未更改的情况下与读取同时访问它,但在一个线程正在写入时不允许对其他线程进行读写访问?
为简单起见,假设我有一个数组和两个方法read() 和write():
int[] rgData;
// ...
int read(int ix) {
return rgData[ix];
}
void write(int ix, int val) {
rgData[ix] = val;
}
实际上,数据结构和两种访问方式都比较复杂。现在,如果我使用 Java 的对象监视器并像这样包装对 read() 和 write() 的调用
synchronized (rgData) {
int val = read(ix);
}
我不再有同时读取,这很可悲,因为同时读取没有问题,写入很少。
一种解决方案可能是通过一个维护队列和线程池的通用管理器来完成所有读取和写入作业。读取作业是并发运行的,如果有写入作业进来,它会等待所有正在运行的作业完成,并且在写入作业运行时不会处理队列。但是有什么更简单的吗?
【问题讨论】:
标签: java concurrency