2012-01-21 82 views
0

我有一個類存儲幾個字符串和整數。這些值正在我的程序中不斷更新。多線程 - 對類成員變量的獨佔訪問?

在同一個程序中,我也有一個簡單的套接字服務器,它處理包含在我的類的對象中的數據的傳入請求。由於服務器代碼包含一個while(true)循環,我假設我需要將代碼放在單獨的線程中。否則一旦我進入這個循環,沒有別的東西會被執行?然後,我會將對我的類的引用傳遞給服務器線程,以便可以獲取值。

static ServerSocket socket1; 
static Socket connection; 

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

無論如何,我想知道如果我要創建一個單獨的服務器線程,那麼我可能會遇到同步問題。當我的課程中遇到某些條件時,課程成員會更新。如果服務器當前正在更新,我不希望服務器能夠讀取這些值。我怎麼能這樣做呢?

+0

有什麼問題嗎?如果你有多個線程訪問同一個變量,那麼,是的,你需要鎖定以防止比賽。 –

+0

我的問題是我如何去做這件事 –

+1

多線程同步是一個巨大的話題。我建議閱讀完整的Java併發實踐,http://jcip.net/ – Luis

回答

1

您可以實現runnable接口並將run循環寫入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 
}