0

我有一个应用程序,它使用类似 cron 的作业来更新一组数据。更新过程每分钟发生一次,不会持续很长时间。servlet 将这个数据集公开给用户。我的问题是在更新过程中,servlet 请求应该阻塞并等待该过程完成。

归根结底,我有这两个功能:

private void updateData() {    
}

public List getData() {
}

第一个函数每分钟运行一次。第二个可以同时调用任意多次。当 updateData 运行时,所有对 getData 的调用都必须等待它完成。一次 getData 调用不应阻止对同一函数的后续调用。updateData 函数的优先级高于getData,即updateData 运行时,必须等待所有getData 调用完成,但不允许开始新的调用。

对于这种情况,我应该使用什么同步机制?我正在使用 Java 服务器,但我很想知道其他平台也存在哪些解决方案。

4

4 回答 4

5

您可以使用ReadWriteLock而不是同步。

ReadWriteLock 维护一对关联的锁,一个用于只读操作,一个用于写入。只要没有写者,读锁可能被多个读线程同时持有。写锁是独占的。

public void updateData() {
    lock.writeLock().lock();
    try {
        /* do stuff. */
    } finally {
       lock.writeLock().unlock();
    }
}


public List getData() {
    lock.readLock().lock();
    try {
       /* process/return data. */
    } finally {
       lock.readLock().unlock();
    }

}

于 2008-12-16T11:32:01.193 回答
3

看看这篇文章:Java 中的读/写锁

我在这个例子中看到的唯一缺点是 notifyAll() 唤醒了所有等待的线程。但是,它确实优先写入锁定请求。

于 2008-12-16T11:56:18.010 回答
0

您需要同步对数据的访问。

public void updateData() {
    synchronized (updateLock) {
        /* do stuff. */
    }
}


public List getData() {
    List data;
    synchronized (updateLock) {
        data = getRealData();
    }
    /* process/return data. */
}
于 2008-12-16T11:01:28.323 回答
0

CopyOnWriteArrayList 或 CopyOnWriteArraySet 值得一看。在更新不频繁的情况下,我一直在大量使用它们。

于 2008-12-16T16:07:17.520 回答