2012-09-17 2 views
0

외부 사용을 위해 스레드로부터 안전한 API를 제공하는 것이 하나의 ClassA라고 가정합니다. 일부 ClassA API는 일부 논리를 수행하기 위해 다른 ClassB의 메소드를 호출해야합니다 (ClassB의 메소드가 상태 비 저장 및 스레드 안전하다고 가정). 그러나 ClassB와 ClassA는 비즈니스 논리로 인해 단일 클래스로 병합 할 수 없습니다. 예를 들어 다음 코드 스 니펫과 같습니다. 이것을 달성하는 더 좋은 방법이 있습니까? 물론, 동기화 된 블록, 동시 잠금없는 데이터 구조와 같은 ClassA에 대한 세분화 된 동시성 제어를 사용할 수 있습니다.스레드 안전 코드를 캡슐화하는 가장 좋은 방법은 무엇입니까

감사합니다.

public class ClassA{ 
    public synchronized void method1(ClassB cb){ 
    //do internal stuff1 
    cb.printAlog(); 
    //do internal stuff2 
    } 
    public synchronized void method2(){ 
    //do internal stuff3 
    } 
    ...... 
} 

public class ClassB{ 
    public void printALog(){ 
    //.... 
    } 
    ...... 
} 
+0

'ClassB'가 상태 비 저장 인 경우,'ClassA'의 필드로 주입하지 않으시겠습니까? – axtavt

답변

2

질문에 의미가 없습니다. 클래스 B가 상태 비 저장 (stateless)이면, 그것을 호출 할 필요가 없습니다. A 클래스의 동기화가 필요한 모든 항목을 동기화해야합니다. 정확히 0 개의 정보를 제공 한 것입니다. B 급은이 질문과는 무관합니다.

+1

클래스는 확실히 스레드로부터 안전 할 수 있습니다. 예를 들어, 변경 불가능한 클래스 – jdevelop

+0

@jdevelop 동의, 편집 됨. – EJP

0

필자가이 질문을 이해한다면, 스레드 안전 코드로 비 스레드 세이프 코드를 지키기를 방황하고있다. 이 시점에서 클래스 B를 노출시키지 않으면 클래스 A의 계약을 위반할 수 있으므로 제공 한 코드는 완전히 합법적입니다.

이 디자인은 Java concurrency in practice에도 잘 설명되어 있습니다.

관련 문제