如何使用数据更新过程同步数据请求?

kgi*_*kis 0 java synchronization

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

在底线我有这两个功能:

private void updateData() {    
}

public List getData() {
}
Run Code Online (Sandbox Code Playgroud)

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

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

ord*_*rig 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();
    }
Run Code Online (Sandbox Code Playgroud)

}