【问题标题】:How can I allow concurrent reads but block all access during a write on an object in Java?如何允许并发读取但在 Java 中写入对象期间阻止所有访问?
【发布时间】: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


    【解决方案1】:

    您想使用在 Java 1.5 中引入的 ReadWriteLock,它正好可以处理这种情况。

    【讨论】:

    • 这是一个答案竞争条件。支持你的并接受 chilitom 的
    【解决方案2】:

    使用ReadWriteLock。它完全满足您的需求。

    【讨论】:

    • 这是一个答案竞争条件。接受你的并赞成 dtsazza 的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多