2010-08-07 2 views
0

synchronized 키워드를 처음 사용하기 때문에 정확하게 작동하는 방식을 아직 확신 할 수 없습니다. 나는 내가이 할 수 있도록 여러 스레드가 액세스 할 수있게하려면 목록이 : 이제동기화 된 목록 사용

players = Collections.synchronizedList(new ArrayList<Player>(maxPlayers)); 

을, 나는 players.get()과 동시에 players.add()를 호출하지하고 있는지 확인하려면, 그래서 내가해야한다고 생각 synchronized 문을 사용하십시오 (메서드 A와 B를 동시에 호출 할 수 있음).

public void A() { 
    synchronized(players) { 
     players.add(new Player()); 
    } 
} 

public void B(String msg) { 
    synchronized(players) { 
     for(int i = 0;i<players.size();i++) { 
      players.get(i).out.println(msg); 
     } 
    } 
} 

올바른 절차입니까? 그렇지 않다면 대신 무엇을해야합니까?

답변

2

synchronizedList가 반환 한 객체를 통해서만 목록에 액세스했다면 액세스는 스레드로부터 안전해야하지만 목록을 반복하거나 여러 항목을 기반으로 의사 결정을하는 등의 복합 작업에 동기화 된 블록을 사용해야 할 수도 있습니다 목록에 대한 호출 (예 : 값을 가져 와서 결정을 내린 다음 값을 추가).

예에서 A()는 동기화 된 블록이 필요하지 않지만 목록을 변경하거나 반복 중에 다른 스레드에서 읽을 수 없도록하려는 경우 B()가 발생할 수 있습니다. 실제로 카운터 반복을 사용하여 은 루프 종료 조건과 항목을 제거하는 다른 스레드 사이의 경쟁 조건을 방지하는 데 필요한이며 다른 반복 방법으로는이 문제가 발생하지 않을 수도 있습니다.

+0

잠깐, 동기화 된 블록은 멀티 컬러 작업에만 필요합니까? 나는 그것이 단지 정보를 얻고있다라고 생각했다. – TheLQ

+1

예, 두 통화 사이에 끼어들 수있는 다른 스레드의 변경 사항으로부터 여러 호출을 보호하려는 경우 예. 단일 작업은 Collections.synchronizedList() 메서드가 제공하는 장식으로 보호됩니다. –

+0

http://download.oracle.com/javase/1.4.2/docs/api/java/util/Collections.html#synchronizedList%28java.util.List%29 javadoc은 항상 동기화 된 블록 반복 할 때. – George