java - java中安全的多线程文件创建

标签 java multithreading locking synchronized

我有一个 web 应用程序,有时需要从 url 下载一些字节并将其打包并发回给请求者。下载的字节会存储一段时间,以便在需要下载相同的 URL 时可以重复使用它们。我试图找出如何最好地防止线程同时下载相同的网址(如果请求同时传入)。我正在考虑创建一个如下所示的类,以防止同时下载相同的网址。如果一个 url 无法被锁定,那么它要么等到它不再被锁定才尝试下载它,只要它在解锁后不存在。

public class URLDownloader
{
    HashMap<String,String> activeThreads = new HashMap<String,String>();

    public synchronized void lockURL(String url, String threadID) throws UnableToLockURLException
    {
        if(!activeThreads.containsKey(url))
            activeThreads.put(url, threadID)
        else
            throw UnableToLockURLException()
    }

    public synchonized void unlockURL(String url, String threadID)
    {
        //need to check to make sure its locked and by the passed in thread
        returns activeThreads.remove(url); 
    }

    public synchonized void isURLStillLocked(String url)
    {
        returns activeThreads.contains(url); 
    }

}

有没有人有更好的解决方案?我的解决方案看起来有效吗?是否有任何开源组件已经可以很好地做到这一点,我可以利用?

谢谢

最佳答案

我建议保留ConcurrentHashSet<String>跟踪对所有线程可见的唯一 URL。此构造可能不直接存在于 java 库中,但可以通过 ConcurrentHashMap 轻松构造,如下所示:Collections.newSetFromMap(new ConcurrentHashMap<String,Boolean>())

关于java - java中安全的多线程文件创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8498606/

相关文章:

c++ - 读取器/写入器锁 (c++)

c - 使用 OMP 中的线程生成相同的随机数

c# - 如何在 C# 中转换传递给 Thread 的参数的数据类型

objective-c - pthread_mutex_t VS @synchronized block ?

java - 如果 Java 中的字符串包含数字,则拆分该字符串 - 但在结果中包含数字?

c# - 锁定 C# switch case 的首选方式

mysql - "Lock wait timeout exceeded"进程列表中没有进程

java - 在java中使用反射查找复合类的所有属性

java - Java中接口(interface)实现的继承

java - 如何使用 Service 或 MediaPlayer 在我的应用程序中播放背景音乐?