我正在构建一个the爬虫,它有两个主要的特性,它们都是以线程的形式执行的:-The获取器(抓取一个网站,并将链接与文件分开存储到数据库中)。-The下载程序(根据获取器返回的url下载文件)。
我有一个对象WebSite,它包含了我想知道的关于一个网站的一切。现在,我想要操作我的数据库,将链接的状态从等待更改为取回,然后再更改为取回。从等待到下载再到下载的文件也是如此。
为了防止Fetcher获取另一个取取器选择的链接,我在WebSite对象中执行了以下函数:
public synchronized String[] getNextLink(){
//Return the next link from database that has visited set to 0 then change it to -1 to say that it's in-use.
}我也用这个函数对我的Downloaders做了同样的工作:
public synchronized String getNextFile(){
//Return the next file from database that has downloaded set to 0 then change it to -1 to say that it's downloading
}这两种方法都在我的WebSite对象中,因为如果有2个取款者在使用不同的网站,他们就不能在我的数据库中选择相同的行(下载器也是如此)。但是可以同时调用这两个函数,因为Fetchers从不选择文件,而Downloaders从不选择链接。
现在,synchronized正在使用单个锁(每个对象),因此不能同时调用我的两个方法。是否有另一个关键字可以使用,每个对象每个方法一个锁?还是我需要对它进行编码?
发布于 2016-01-14 13:14:33
与将synchronized关键字应用于整个方法(该方法隐式使用this作为锁对象)不同,您可以在方法中使用两个独立的锁对象(在Java中任何对象都可以用作锁对象)。每个锁对象将独立于其他对象:
private final Object fetcherMutex = new Object();
private final Object downloaderMutex = new Object();
public String[] getNextLink(){
synchronized (fetcherMutex) { /* ... */ }
}
public String[] getNextFile(){
synchronized (downloaderMutex) { /* ... */ }
}https://stackoverflow.com/questions/34790209
复制相似问题