假设我有一个需要调整某些图像文件大小的多线程应用程序。我不希望多个线程能够同时调整同一个图像并覆盖彼此的结果并破坏文件,但为了最大化并发性,我希望多个线程能够同时调整不同图像的大小。
线程获取特定图像锁定的最佳方法是什么,而不是简单地同步整个代码块?
答案 0 :(得分:2)
使用固定线程ExecutorService
并拥有一个线程,将所有图像提交到要处理的服务中。只要您不提交两次相同的图像,就不会有问题。
您还可以拥有一个线程,为其他线程提供“todo”BlockingQueue
。那么你有一个线程来控制线程处理的图像,因此不需要锁定。
另一种方法是使用ConcurrentHashMap
并使每个线程putIfAbsent
,然后只在它工作时才使用图像。
if (concurrentMap.putIfAbsent(imagePath, null) == null) {
// do the processing
// either remove it from map when done or leave it to stop future processing
}
// I guess loop around and look at the next image
答案 1 :(得分:-1)
编辑:刚看到对我的评论的回复
- 由于图像是磁盘上的文件,因此使用 1个线程从磁盘读取图像和 1个线程进行处理。假设调整图像大小不会花费更长的时间来寻找文件并加载它们。