首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java :每个对象每个方法一个锁

Java :每个对象每个方法一个锁
EN

Stack Overflow用户
提问于 2016-01-14 12:56:33
回答 1查看 255关注 0票数 0

我正在构建一个the爬虫,它有两个主要的特性,它们都是以线程的形式执行的:-The获取器(抓取一个网站,并将链接与文件分开存储到数据库中)。-The下载程序(根据获取器返回的url下载文件)。

我有一个对象WebSite,它包含了我想知道的关于一个网站的一切。现在,我想要操作我的数据库,将链接的状态从等待更改为取回,然后再更改为取回。从等待下载再到下载的文件也是如此。

为了防止Fetcher获取另一个取取器选择的链接,我在WebSite对象中执行了以下函数:

代码语言:javascript
复制
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做了同样的工作:

代码语言:javascript
复制
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正在使用单个锁(每个对象),因此不能同时调用我的两个方法。是否有另一个关键字可以使用,每个对象每个方法一个锁?还是我需要对它进行编码?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-14 13:14:33

与将synchronized关键字应用于整个方法(该方法隐式使用this作为锁对象)不同,您可以在方法中使用两个独立的锁对象(在Java中任何对象都可以用作锁对象)。每个锁对象将独立于其他对象:

代码语言:javascript
复制
private final Object fetcherMutex = new Object();
private final Object downloaderMutex = new Object();

public String[] getNextLink(){
    synchronized (fetcherMutex) { /* ...  */ }
}

public String[] getNextFile(){
    synchronized (downloaderMutex) { /* ...  */ }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34790209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档