簡體   English   中英

多線程中的同步對象

[英]Synchronized object in multiple threads

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

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

這是我需要的快速草稿:

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();
        /* ... */
    }

}

現在在這里,潛在的多個線程可以同時訪問套接字輸入流,這將是非常糟糕的。

現在,我的問題是:在這種情況下, synchronized關鍵字是否有效?

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

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

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

但是,由於鎖是在run方法的整個過程中保持的,因此您可以有效地序列化對套接字的訪問並繞過應用程序的多線程方面。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM