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

Java : one lock per method per object

我正在构建一个网络爬虫,它有 2 个主要功能,它们都作为线程执行: - 获取器(抓取网站并将 links 从文件中分离出来,将它们都存储到数据库中)。 - 下载器(根据提取器返回的 url 下载文件)。

我有一个对象 WebSite,其中包含我想了解的有关网站的所有信息。现在我想操纵我的数据库将 link 的状态从 waiting 更改为 fetching 然后到 fetched 。从 waitingdownloading 然后到 downloaded.

的文件也是如此

为了防止 Fetcher 获取另一个获取器选择的 link 我在我的 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 个 Fetcher 正在处理不同的网站,它们不能 Select 我的数据库中的同一行(下载程序也是如此)。但是两个函数可以同时调用,因为 Fetchers never select a file and Downloaders never select a link.

现在 synchronized 使用单个锁(每个对象),所以不能同时调用我的两个方法。是否有另一个关键字使用 每个对象每个方法一个锁 ?或者我需要编码吗?

不是将 synchronized 关键字应用于整个方法,它隐式使用 this 作为 lock-object,您可以使用两个独立的锁对象(和 any 对象可以在方法中用作 lock-object in Java)。每个锁对象都将独立于其他对象:

private final Object fetcherMutex = new Object();
private final Object downloaderMutex = new Object();

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

public String[] getNextFile(){
    synchronized (downloaderMutex) { /* ...  */ }
}