2013-10-17 4 views
2

여러 스레드가 액세스하는 ArrayList가 있습니다. 주 스레드는 목록을 지우고 다른 스레드는 목록에 추가합니다. 다른 스레드가 항목을 추가하는 동안 목록이 지워지는 것을 원하지 않습니다. 스레드가 항목을 추가하는 동안 목록이 잠겨 있기를 원합니다. Java 목록 동기화

은 추가 스레드의 코드입니다 :

synchronized (items) 
{ 
    int length = jsonArray.length(); 
    if ((length > 0)) for (int i = 0; i < length; i++) 
    { 
     items.add(new Item(jsonArray.getJSONObject(i))); 
    } 
} 

하지만 삭제에 대한 동기화 블록을 사용하지 마십시오. 동기화 된 블록이 클리어 할 때도 필요합니까?

답변

1

다른 스레드가 항목을 추가하는 동안 목록이 지워지지 않게하고 싶습니다.

그렇다면 clear 루틴 synchronized도 있어야합니다.

아래 예제에서 add의 synchronized 문은 clear을 차단하지 않습니다.

public void add(T t) { 
    synchronized(items) { 
     items.add(t); 
    } 
} 

public void clear() { 
    items.clear(); 
} 
+0

그래서, 동기화 된 블록은 목록을 완전히 잠그지 않습니다.이 경우 다른 추가 스레드에서만 잠급니다. – Ali

+0

주 스레드가 클리어 연산을 수행하는 동안 일부 스레드가 추가되기 시작하면 어떻습니까? –

+0

'synchronized (items)'는'items.add (t)'의 여러 동시 호출을 차단합니다. '동기화 '부족으로 인한'루틴 '루틴은 잠금을 모르거나 상관하지 않습니다. –

2

이 처리하는 빠른 방법은 바로 모든 방법이 동기화됩니다

List<Foo> items = Collections.synchronizedList(new ArrayList<Foo>()); 

을 사용하는 것입니다 그리고 당신은 안전 할 것이다.

누군가 성과에 대해 의견이있는 경우 OP의 시나리오에 대한 실제 데이터를 제공하여 클레임을 백업하십시오.

+1

내가 synchronizedList에 관해 읽었을 때, 그것은 단지 하나의 add만을 보호하고 add는 추가하지 않는다. – Ali

+0

글쎄, addAll()을 사용하여 항목 배치를 추가 할 수 있습니다. 시나리오가 약간 명확하지 않지만. 왜 주 스레드가 배열을 지우고 있습니까? 그것은 항목을 제거하고 다른 곳에 저장하는 것입니까? – Kayaman

+0

아니요, 사용자가 다른 주문을 선택하면 새 항목이 인터넷에서로드되도록 목록을 지 웁니다. 다른 스레드가 명확한 후에 추가하면 목록 맨 위에옵니다. – Ali