2013-08-20 1 views
2

대 나는 차이가 동기화자바 동기화 된 컬렉션은 객체

List<Integer> intList = Collections.synchronizedList(new ArrayList<Integer>()); 

synchronized (intList) { 
    //Stuff 
} 

의 다음과 같은 방법 사이에 무엇인지 궁금 객체가 첫 번째 방법은 개별 메서드 호출이 있는지 확인합니다

Object objectLock = new Object(); 

List<Integer> intList = new ArrayList<Integer>(); 

synchronized (objectLock) { 
    //Stuff 
} 

답변

6

잠금 사용하고 있습니다 동기화되어 별도의 잠금 객체를 관리 할 필요가 없습니다. 하나 개의 스레드는

intList.add(3); 

를 호출 할 수있는 또 다른는 synchronized 블록없이

intList.clear(); 

를 호출 할 수 있습니다, 그것은 제대로 동기화됩니다. (불행하게도, 이것은 함수 호출 그룹에 대해 잠금을 유지해야 할 때 도움이되지 않으며, 그 호출 주위에 synchronized 블록이 필요합니다.) 또한,리스트를 전달해야한다면

을 사용할 수 있습니다.
otherObject.doStuffWith(intList); 

return intList; 

대신

otherObject.doStuffWith(intList, objectLock); 

return ListAndLock(intList, objectLock); 
+0

감사합니다, 내 질문을 – user2686811

0

표시하는 코드는 반드시 스레드 안전성이 아닙니다!

한 발췌와 다른 발췌 간의 유일한 차이점은 동기화를위한 모니터로 사용하는 개체입니다. 이 차이는이에 대한

큰 읽기 보호하려는 가변 데이터에 액세스해야하는 다른 스레드에 의해 동기화에 사용되어야하는 개체를 결정합니다 : java concurrency in practice

+0

감사 응답, I 읽으십시오. – user2686811