2013-06-19 1 views
2

Java 메소드 동기화와 관련된 문제가 있습니다. 간단히 설명 할 수 있기를 바랍니다.다른 클래스 (및 다른 패키지)의 두 메소드 동기화

두 개의 다른 클래스에서 서로 다른 두 가지 패키지가 있습니다. 뭔가 같이 :

Package1 
    |_Class1 
      \MethodA 

Package2 
    |_Class2 
      \MethodB 

좋아, 그래서 지금은 하지 스레드은이 두 가지 방법을 동기화해야합니다.

공유 세마포어 : 지금까지, 나는 두 가지 접근 방법이있다.

package Package3; 

public class SemaphoreClass { 

    public static Semaphore; 

} 

JVM 어쨌든,이 공유 세마포어를 고려한다면 난 정말 모르겠어요

Package1Package2 밖에서 뭔가를 공유 정적 세마포어를 생성합니다.

동기화 됨 (SharedClass.class). 그 두 가지 방법을 동기화하기 위해 공유 클래스를 사용

같은 일이 :

public void MethodA() { 
     synchronized (SharedClass.class) { 
      //... 
     } 

public void MethodB() { 
     synchronized (SharedClass.class) { 
      //... 
     } 

어쨌든, 이건 그냥 접근이다. 달성하고자하는 것을 구현하는 가장 좋은 방법은 무엇인지 듣고 싶습니다. JVM을위한 공유 세마포어를 사용하면 작업이 더 쉬워 질 것이지만,이를위한 솔루션이 있어야한다는 것을 알고 있습니다. 미리 감사드립니다.

+3

세마포어 솔루션은 괜찮습니다 ... 그러나 finally 블록에서 해제하는 것을 잊지 마십시오! – fge

+0

클래스가 다른 패키지에 있다는 사실은 관련이 없으므로 단일 클래스의 인스턴스를 동기화하는 것과 같은 방법으로 인스턴스를 동기화 할 수 있습니다. – SJuan76

+1

@ SJuan76 나는 그것이 정말로 관련이 없다는 것을 안다. 그래서 그것들을 "()"안에 넣는다;) –

답변

3

두 가지 방법 모두 작동해야하지만 클래스 잠금은 권장되는 방법이라고 생각하지 않습니다. Object의 인스턴스 잠금을 사용하거나 java.util에서 적절한 잠금을 사용하십시오. 또한 String을 잠그지 마십시오.

양자 택일로, 당신은 클래스 Class1Class2의 인스턴스를 인스턴스화하는 동안 매개 변수로 잠금을 취할 수 있도록 수 :

다음
class Class1 { 
     private final Object lock; 
     public Class1(Object lock) { this.lock = lock } 
     public method() { synchronize(lock) { }); 
    } 

당신이 (new Object()와) 하나 잠금을 만들 수 있는지 확인하고에 전달 Class1Class2의 두 인스턴스

기본적으로 2 가지 클래스가 정적으로 전역을 공유하지 않으며 원래 매개 변수 만 수신합니다. 2) Class1Class2의 클라이언트가 올바른 잠금 장치를 전달해야합니다. Class1Class2의 클라이언트는 "오케 스트레이터"역할을합니다.

관련 문제