2012-01-21 2 views
0

여러 개의 문자열과 정수를 저장하는 클래스가 있습니다. 이 값들은 내 프로그램에 의해 지속적으로 업데이트되고 있습니다.여러 스레드 - 클래스 멤버 변수에 대한 독점적 액세스?

동일한 프로그램에서 클래스의 객체에 포함 된 데이터에 대한 수신 요청을 처리하는 간단한 소켓 서버도 있습니다. 서버 코드에는 while(true) 루프가 포함되어 있으므로 코드를 별도의 스레드에 배치해야한다고 가정합니다. 그렇지 않으면이 루프에 들어가면 다른 어떤 것도 실행되지 않겠습니까? 그런 다음 클래스에 대한 참조를 서버 스레드로 전달하여 값을 얻을 수 있습니다.

static ServerSocket socket1; 
static Socket connection; 

while (true) { 
    connection = socket1.accept(); 
    ... 
} 

어쨌든 별도의 서버 스레드를 만들면 동기화 문제가 발생할 수 있습니다. 내 프로그램에서 특정 조건이 충족되면 클래스 멤버가 업데이트됩니다. 나는 그들이 현재 업데이트되는 과정에있는 경우 서버가 값을 읽을 수 있도록하고 싶지 않다. 어떻게이 일을 할 수 있습니까?

+0

무엇이 질문입니까? 동일한 변수에 액세스하는 스레드가 여러 개인 경우 경쟁을 막기 위해 잠글 필요가 있습니다. –

+0

내 질문에 대해 어떻게 할 수 있습니다. –

+1

멀티 스레딩 동기화는 큰 주제입니다. Java Concurrency in Practice 전체를 읽는 것이 좋습니다. http://jcip.net/ – Luis

답변

1

runnable 인터페이스를 구현하고 run() 메소드에 루프를 작성할 수 있습니다.

public class SocketClass implements Runnable { 
    // variables 

    // running the thread 
    public void run() { 
    while(true) { 
     // loop 
    } 
    } 
} 

메인 스레드에서 new Thread(...).start()으로 새 스레드를 시작할 수 있습니다.

SocketClass socket = new socketClass(); 
new Thread(socket).start(); 

그런 다음 변수에 액세스 할 수있는 SocketClass에 대한 참조가 있습니다. 데이터를 읽거나 업데이트 할 때 작업중인 클래스 나 객체에서 동기화해야합니다.

// in main thread 
synchronized(socket) { 
    // read data 
} 

// in SocketClass 
synchronized(this) { 
    // write data 
} 
관련 문제