저는 Java에 익숙하지 않고 Java의 동시성을 이해하려고합니다. 나는 자바 동시성에 꽤 인기 page에이 코드를 건너 온 탐험하는 동안 :이 코드가 중요 섹션에서 상호 배제를 위반하지 않습니까?
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;
}
}
}
여기 선 아래로, 상호 배제을 위반 옆에 그() 함수를 생각 :
if (linkedSites.size() == 0) {
return null;
}
외부 보관 일부 스레드가 add() 또는 next()에서 동기화 된 블록 내에서 linkedSites를 수정하는 경우 다른 스레드에서 읽을 수 있습니다.
내가 잘못했을 경우를 대비하여 저를 시정하십시오.
틀렸어. 목록에 대한 모든 액세스는 동기화되어야합니다. –