Java 缓存刷新时停止排除其他线程

Java 缓存刷新时停止排除其他线程,java,multithreading,Java,Multithreading,我有一个功能,需要在定义的时间间隔后在后台运行作业。 为此,我使用ScheduledExecutorService在特定时间间隔后执行线程 为了存储缓存数据,我正在使用并发哈希映射 ConcurrentHashMap 当刷新正在进行时,应用程序中的另一个线程检查缓存并覆盖地图数据。我尝试使用Synchronized,但不起作用。基本上,我想要实现的是在缓存刷新正在进行时暂停其他进程。您可以使用ReentrantReadWriteLock同步读写操作。在ReentrantReadWriteLock

我有一个功能,需要在定义的时间间隔后在后台运行作业。 为此,我使用ScheduledExecutorService在特定时间间隔后执行线程

为了存储缓存数据,我正在使用并发哈希映射

ConcurrentHashMap


当刷新正在进行时,应用程序中的另一个线程检查缓存并覆盖地图数据。我尝试使用Synchronized,但不起作用。基本上,我想要实现的是在缓存刷新正在进行时暂停其他进程。

您可以使用ReentrantReadWriteLock同步读写操作。在ReentrantReadWriteLock中,允许多个线程读取&只允许一个线程写入您的共享资源,该资源在您的案例中是映射的。如果一个线程正在写入您的共享资源,那么其他线程将等待读/写请求

ReadWriteLock readWriteLock = new ReentrantReadWriteLock();


readWriteLock.readLock().lock();

    // multiple readers can enter this section
    // if not locked for writing, and not writers waiting
    // to lock for writing.

readWriteLock.readLock().unlock();


readWriteLock.writeLock().lock();

    // only one writer can enter this section,
    // and only if no threads are currently reading.

readWriteLock.writeLock().unlock();

因此,当缓存刷新时,不允许其他线程读/写映射,但当没有线程写入时,则允许多个线程读映射

为什么
同步
不工作?此外,您还应该展示一些您尝试过的代码?在我看来,您不需要暂停线程-一个简单的信号灯应该可以完成这个任务,是的,这是同步的。