2013-07-17 7 views
1

우선 스레드 및 공유 변수를 처음 사용합니다. 그래서 제발 친절 하구요 ;-)공유 스레드 변수 읽기 및 쓰기

나는 Routing이라는 수업을 진행하고 있습니다. 이 클래스는 메시지를 수신하고 처리합니다. 메시지 유형이 A 인 경우 Routing -Object는 Runnable 인터페이스를 구현하는 ASender 개체로 전달해야합니다. 메시지 유형이 B 인 경우 Routing -Class는 BSender 개체로 전달해야합니다.

그러나 개체에는 Routing -Object에 저장해야하는 공통 변수가 있습니다.

내 아이디어는 Routing -Object와 getter/setter에서도 변수를 synchronized/volatile로 선언하는 것입니다.

코드를 동기화하는 올바른 방법입니까? 아니면 뭔가 빠졌습니까?

편집 : 기본 코드 아이디어가 추가되었습니다.

RoutingClass

public class Routing { 

private synchronized Hashtable<Long, HashSet<String>> reverseLookup; 
private ASender asender; 
private BSender bsender; 

public Routing() { 
    //Constructor work to be done here.. 
    reverseLookup = new Hashtable<Long, HashSet<String>>(); 

} 

public void notify(TopicEvent event) { 

    if (event.getMessage() instanceof AMessage) { 
     asender = new ASender(this, event.getMessage()) 

    } else if (event.getMessage() instanceof BMessage) { 
     bsender = new BSender(this, event.getMessage()) 

    } 
} 

public synchronized void setReverseLookup(long l, Hashset<String> set) { 
    reverseLookup.put(l, set); 

} 

public synchronized Hashtable<Long, Hashset<String>> getReverseLookup() { 
    return reverseLookup; 
} 
} 

ASender 클래스

public class ASender implements Runnable { 

private Routing routing; 
private RoutingMessage routingMessage; 

public ASender(Routing r, RoutingMessage rm) { 
    routing = r; 
    routingMessage = rm; 
    this.run(); 
} 

public void run() { 
    handleMessage(); 
} 

private void handleMessage() { 
    // do some stuff and extract data from the routing message object 

    routing.setReverseLookup(somethingToSet) 
} 
} 
+3

. 코드 문제. –

+1

[내가 전문가라고 생각하나요?] (http://programmer.97things.oreilly.com/wiki/index.php/The_Guru_Myth) –

+0

좋아요, 이해합니다 .. 코드를 추가하겠습니다 ... – smsnheck

답변

1

일부 의견 :

  1. 해시 테이블 당신은 this을 볼 또 다른 "동기화"키워드를 필요로하지 않으며, 스레드 안전 구현 자세한 내용은 this
  2. 연결을 피하거나 인터페이스에 대한 작업을 시도하거나 보낸 사람에게 해시 테이블을 전달하십시오. 자세한 내용은 this을 참조하십시오.
  3. 보낸 사람의 수에 따라 ConcurrentHashMap을 사용하면 성능이 크게 향상됩니다. ConcurrentHashMap and Hashtable in Java

Java theory and practice: Concurrent collections classes은 ... 같은 결론을 내릴 것입니다 : 코드가 코드를 보지 않고 옳다면 우리는 말할 수 없다

public interface IRoutingHandling { 

    void writeMessage(Long key, HashSet<String> value); 

} 

public class Routing implements IRoutingHandling { 

    private final Hashtable<Long, HashSet<String>> reverseLookup; 

    private ASender asender; 
    private BSender bsender; 

    public Routing() { 
     //Constructor work to be done here.. 
     reverseLookup = new Hashtable<Long, HashSet<String>>(); 
    } 

    public void notify(TopicEvent event) { 
     if (event.getMessage() instanceof AMessage) { 
      asender = new ASender(this, event.getMessage()) 

     } else if (event.getMessage() instanceof BMessage) { 
      bsender = new BSender(this, event.getMessage()) 

     } 
    } 

    @Override 
    public void writeMessage(Long key, HashSet<String> value) { 
     reverseLookup.put(key, value); 
    } 

} 

public class ASender implements Runnable { 

    private IRoutingHandling _routingHandling; 

    public ASender(IRoutingHandling r, RoutingMessage rm) { 
     _routingHandling = r; 
     routingMessage = rm; 
     this.run(); 
    } 

    public void run() { 
     handleMessage(); 
    } 

    private void handleMessage() { 
     // do some stuff and extract data from the routing message object 

     _routingHandling.writeMessage(somethingToSetAsKey, somethingToSetAsValue) 
    } 

} 
+0

의견을 보내 주셔서 감사합니다. 나는 변환하려고 노력할 것입니다 (이것이 올바른 용어입니까? 저는 독일어입니다 ..) 당신의 생각. – smsnheck

+0

마지막 질문 하나. 제가 벡터를 가지고 있다고 가정 해 봅시다. Vector 클래스는 스레드로부터 안전하지 않으므로 add() 및 get() 메서드에서 동기화해야합니다. 더 좋은 방법은 무엇입니까? synchronized (벡터)를 통해 동기화 {vector.get (value); } 또는 public synchronized Vector getVector (문자열 값) {return vector.get (value); }? – smsnheck

+0

사실, java.util.Vector의 각 메소드는 동기화되어 있습니다. http://docs.oracle.com/javase/6/docs/api/java/util/Vector.html을 참조하십시오. 다시 말하면 동기화 된 키워드를 추가 할 필요가 없습니다. – Velth