2011-08-09 2 views
2

모델이 있습니다. 이것은 실제로 객체의 ArrayList입니다. 그리고 나는 또한 그것을 다루는 방법을 가지고있다. remove(), find(), getAll(), create(), add(), loadFromFile() 및 storeInFile()과 같은 메소드입니다.모델의 Java 동기화

다른 클라이언트에서 사용하는이 모델입니다. 둘 다이 리소스에 대한 참조를 가지고 있습니다. 동기화하지 않고 모델을 변경하도록해도 괜찮습니까? 그들은 동시에 특정 메소드를 호출 할 수 있습니다.

어떻게 동기화해야합니까? 메서드 또는 컬렉션을 동기화해야합니까?

답변

-1

ArrayList에서 Vector으로 변경하면 충분합니다. 벡터는 스레드 안전 구현 자 (java.util.List)입니다. 가장 빠른 방법이 아니라면 스레드로부터 안전하게하는 가장 쉬운 방법 인 것 같습니다.

+2

가장 빠른 변경이지만 동기화를 명시 적으로 나타내지는 않습니다. 프로그래머에게는 추가적인 부담이 주어집니다 : 암시적인 동기화 사용으로 인해 사용되는 콜렉션을 변경하지 마십시오. synchronized 키워드를 사용하여 모델의 API 레벨 수준에서 동기화하는 것이 좋습니다. – Atreys

+0

'Vector'는 쓸데없는 것으로 간주됩니다. http://stackoverflow.com/questions/1386275/why-java-vector-class-is-considered-obsolete-or-deprecated – Qwerky

+1

거의 쓸모없는 Vector 클래스를 사용하는 이유는 무엇입니까? 리스트를 포함한 객체의 액세스를 동기화하거나 Collection.synchronizedList에 래핑 된 ArrayList와 같이 Collection에서 새로운 권장 클래스 중 하나를 사용하십시오. 후자는 [ArrayList API] (http://download.oracle.com/javase/6/docs/api/java/util/ArrayList.html)에서 잘 설명되어 있습니다. –

2

다릅니다. 예를 들어 컬렉션에 새 객체를 추가하기 전에 메소드가 좀 더 긴 논리를 사용한다면 메소드 레벨에서 작업을 동기화하는 것이 좋습니다. 물론 ArrayList를 스레드 안전 컬렉션으로 변경하는 것보다 속도가 느리지 만 이전에 일부 작업을 수행 한 경우 컬렉션에 넣은 데이터가 구형이 아닌지 확인할 수 있습니다.

물론 다른 경우에는 내부 컬렉션 동기화가 훨씬 더 좋은 해결책입니다.

2

동기화하지 않고 모델을 변경하도록해도 괜찮습니까?

no. 공유 리소스 인 경우 클라이언트의보기가 일관되지 않습니다. 간단히 이며 허용되지 않는 것은입니다.

어떻게 동기화해야합니까?

synchronized 키워드를 사용하십시오.

메서드 또는 컬렉션을 동기화해야합니까?

나는 방법이 아닌 컬렉션을 동기화하는 것이 좋습니다. 예 :

public void add(Object o){ 
    synchronized(foo){ 
     foo.add(o); 
    } 
} 

여기에서 foo은 내 컬렉션입니다.


자세한 내용은 다음을 참조하십시오

0

당신은 모델의 각 방법에 대해 생각에서 메소드를 호출하는 다중 스레드의 결과를 고려할 필요가 같은 시간, 그 결과는 무엇입니까. 어떤 결과가 나쁠 경우 동기화를 사용하십시오. 아무도 모델 뒤에있는 논리를 모른 채 올바른 대답을 줄 수는 없습니다.