저는 클라이언트 (클라이언트 당 하나의 스레드)로부터 다양한 xml 메시지를 받고 메시지 유형에 따라 다른 기능으로 메시지를 라우팅하는 서버를 가지고 있습니다. 예 : 메시지의 첫 번째 요소에 'login'문자열이 포함되어 있으면이 메시지가 로그인 메시지임을 나타내며 메시지를 login() 함수로 라우팅합니다.어떻게이 스레드를 안전하게 만들 수 있습니까?
어쨌든 여러 클라이언트가 연결되어 있고 디스패처가 메시지 라우팅 중간에 스레드를 전환하면 상황이 엉망이되지 않도록이 메시지를 작성하려고합니다.
이public void processMessagesFromClient(Client client)
{
Document message;
while (true)
{
try
{
message = client.inputStream.readObject();
/*
* Determine the message type
*/
String messageType = getMessageType(message);
// Route the message depending on its type
switch (messageType)
{
case LOGIN:
userModel.handleLogin();
...
...
...
etc...
}
} catch(Exception e) {}
}
그래서 어떻게이 스레드로부터 안전 할 수 있습니다 - 그래서 여기에 어떻게 메시지를 라우팅하고있다? 내가 어딘가에 있지만 어디 있는지 모르겠 동기화 성명을 넣어야 할 그림. (내 https://stackoverflow.com/a/416198/1088617
그리고 싱글이에 동기화 사용에 적합하지 않습니다 말한다 여기에 또 다른 포스트 - 또한 필자는 주제에 주위를 읽고 난 '이'동기 사용에 문제가 말한다이 게시물을 발견 위의 코드에서 클래스는 싱글 톤입니다.) - https://stackoverflow.com/a/416202/1088617
로 설정되어 있는지 확인해야합니까? – GavinCattell
위의 기능은 모든 클라이언트에서 사용됩니다. 나는 각 클라이언트에 대한 스레드를 시작하고 먼저 input/outputstreams를 검색 한 후 위의 processMessagesFromClient() 메소드를 반복적으로 반복합니다. 따라서 모든 클라이언트는 '메시지'변수를 공유하게됩니다. 그들은 또한 싱글 톤이기 때문에 모두 userModel을 공유합니다. 클라이언트로부터 메시지를 받으면 그 메시지를 처리 할 때까지 다른 스레드를 차단해야한다고 생각하니? –