我是 Java 新手,并试图了解 Java 中的并发性。在探索时,我在一个非常流行的 Java 并发页面上遇到了这段代码:
public class CrawledSites {
private List<String> crawledSites = new ArrayList<String>();
private List<String> linkedSites = new ArrayList<String>();
public void add(String site) {
synchronized (this) {
if (!crawledSites.contains(site)) {
linkedSites.add(site);
}
}
}
/**
* Get next site to crawl. Can return null (if nothing to crawl)
*/
public String next() {
if (linkedSites.size() == 0) {
return null;
}
synchronized (this) {
// Need to check again if size has changed
if (linkedSites.size() > 0) {
String s = linkedSites.get(0);
linkedSites.remove(0);
crawledSites.add(s);
return s;
}
return null;
}
}
}
我认为这里的函数 next() 违反了互斥,如下所示:
if (linkedSites.size() == 0) {
return null;
}
被保存在同步块之外,因此如果某个线程在 add() 或 next() 中修改同步块内的linkedSites,则允许其他线程读取它。
如果我错了,请纠正我。