2011-08-24 4 views
9

컨테이너 관리 동시성을 사용하는 데 사용되는 싱글 톤 세션 bean과 주석에 대해 읽었습니다. 나는 단순히 '동기화 된'키워드를 사용하는 것에 비해 이점이 없다는 것을 알기 때문에 내가 빠뜨린 중요한 것이 무엇인지 의심 스럽다. , Rubinger & 버크에 의해 도서 "Enterprise JavaBeans 3.1"에서 오라일리이 예제를 고려하십시오EJB 3.1 컨테이너 관리 동시성 대 동기화

@javax.ejb.Lock(javax.ejb.LockType.READ) 
public String concurrentReadOnlyMethod(){...} 

@javax.ejb.Lock(javax.ejb.LockType.WRITE) 
public void allowOnlyOneWriteAtATimeMethod(String stringToSet){...} 

방법 읽기 경우 모든 toghether 주석을 생략하고, 쓰기의 경우에 synchronized 키워드를 사용하는 것보다 더 나은이있다 , 이렇게 :

public String concurrentReadOnlyMethod(){...} 

public synchronized void allowOnlyOneWriteAtATimeMethod(String stringToSet){...} 

답변

4

간단한.

"concurrentReadOnlyMethod"는 전혀 동기화되지 않으므로 동기화의 다른 부작용이 발생하지 않습니다 (예 : 메모리 모델 내의 변수에 대한 영향). 또한 READ 잠금은 WRITE 잠금을 차단하므로 동기화 된 경우 두 방법을 동시에 실행하는 두 개의 스레드를 가질 수 있지만 READ/WRITE 잠금은 수행하지 않습니다.

물론 여러 개의 READ 잠금과 몇 개의 WRITE 잠금을 사용하면 모든 READ 잠금을 공유하고 동시에 실행할 수 있으므로 WRITE 잠금이 정상 동기화와 비슷하게 작동 할 때 더 많은 가치가 있습니다. 윌에서 언급 한 바와 같이

+1

내가 올바르게 이해한다면, 다음과 같이 비공식적으로 표현할 수 있습니다. 위의 두 가지 방법을 모두 포함하는 하나의 클래스와 컨테이너 관리 동시성의 의미는 "쓰기가 진행되지 않는 한 동시 읽기가 허용됩니다"입니다. 대비되는 예제의 의미는 "동시 읽기는 허용되며, 쓰기가 진행되는 동안에도 동시에 쓰레드는 한 번에 하나만 쓰게됩니다"라고합니다. –

+0

예, 그걸 꽤 잘 요약 해줍니다. –

+0

EJB 3.1에서이 읽기/쓰기 잠금의 의미에 대한 참조를 제공 할 수 있습니까? 나는 사양에서도 찾을 수 없었다. – illEatYourPuppies

2

음, synchronized 당신은 실제로 javax.ejb.Lock 주석의 동작을 복제 할 수 없습니다,하지만 당신은 ReadWriteLock 잠금을 사용하여 그것을 실제로 수 있지만, 이것은 결국 더 많은 작업이다.

싱글 톤 인스턴스가 여러 JVM에서 공유되지 않기 때문에 (분산 객체가 아니라는 의미) 사실 내가 생각할 수있는 다른 이점은 없습니다. Lock은 사용하기 쉽고 사용하기 쉬운 형태로 제공합니다 지원하다.

"이 주석을 사용하지 않으면 Lock (WRITE) 값이 가정됩니다."따라서 실제 제거 할 수도 없습니다.