2013-12-11 69 views
2

我有一個創建多個線程的類,每個線程在構造函數中獲取一個套接字作爲參數。多線程中的同步對象

我需要同步這些線程,以便在給定的時間只有一個線程訪問套接字流。

這裏是什麼,我需要快速草案:

class MyClass{ 
    Socket socket; 

    public MyClass() { 
     socket = new Socket(address, port); 
    } 

    void createThread(){ 
     Worker worker = new Worker(socket); 
     Thread t = new Thread(worker); 
     t.start(); 
    } 

    void doStuff(){ 
     InputStream is = socket.getInputStream(); 
     /* ... */ 
    } 
} 

class Worker implements Runnable{ 
    Socket socket; 

    public Worker(Socket socket){ 
     this.socket = socket; 
    } 


    @Override 
    public void run() { 
     InputStream is = socket.getInputStream(); 
     /* ... */ 
    } 

} 

現在這裏,可能多個線程可以在同一時間,這將是非常糟糕的訪問插座輸入流。

現在我的問題是:將​​關鍵字爲這種情況下工作?

回答

6

要使用基本同步,您可以使用套接字作爲鎖,因爲它由每個工作者共享。

public void run() { 
    synchronized (socket) { 
     InputStream is = socket.getInputStream(); 
     /* ... */ 
    } 
} 

如果MyClass確實需要訪問套接字爲好,doStuff執行相同的同步。

但是,由於鎖在整個持續時間內保持不變,因此您正在有效地序列化對套接字的訪問並繞過應用程序的多線程方面。

+0

也許最好是有一個套接字訪問類,可以獨佔訪問套接字,用來存儲所有傳入的數據。工人然後以同步的方式訪問這些數據 – xmoex