如何处理锁对象映射中的条目管理?

时间:2019-05-16 07:50:35

标签: kotlin concurrency locking semaphore concurrenthashmap

我的应用程序创建了一个索引,该索引保存在磁盘上的数千个文件中。我想使用应用程序的多个实例访问索引文件。因此,我使用java FileLock锁定了我正在不同的JVM之间读取的文件。
如果我尝试使用同一应用程序两次获取FileLock,则会得到一个HttpClients.createDefault().use {client -> val post = HttpPost("yourUri").apply { entity = ByteArrayEntity(File("yourFile").readBytes()) // addHeader or setHeaders ... addHeader("headerName", "value") // ... all your headers... } client.execute(post) } (这就是FileLock应该起作用的方式)。为了防止在一个实例中对同一文件进行多次获取,我创建了一个Map。如果应用可以获取特定文件的信号灯,则它还可以获取FileLock。如果不是,则该文件当前正在被应用程序使用。 使用OverlappingFileLockException时,它就像一个超级按钮。如果需要,我使用ConcurrentHashMap将信号量添加到地图。

问题是:我创建的文件越多,我在地图中存储的信号量就越多。运行该应用程序几天会导致地图爆炸。为了防止这种情况,我想在释放未使用的条目时将它们删除。

我不能像第二版函数那样删除信号量。如果信号量已将线程排队,则队列中的下一个线程将获取FileLock。一个新线程将不会在地图上找到该信号灯,而是创建一个新线程,再次获取FileLock。我必须检查是否computeIfAbsent并仅在没有排队线程的情况下将其删除。但这不是原子操作。 我试图用一个信号量锁定信号量的获取/释放功能,以使两个功能同步(不好的做法),只是看它是否可以工作。最终陷入僵局。

semaphore.hasQueuedThreads()

我想在释放地图时从地图中删除一个信号,并且没有线程在等待该信号。这应该是原子操作,因此不会为同一文件创建第二信号。

0 个答案:

没有答案