多个线程中的同步对象

时间:2013-12-11 20:23:09

标签: java multithreading

我有一个创建多个线程的类,每个线程在构造函数中获取一个socket作为参数。

我需要同步线程,以便在给定时间只有一个线程访问套接字流。

以下是我需要的快速草稿:

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关键字是否适用于此案例?

1 个答案:

答案 0 :(得分:6)

要使用基本同步,您可以使用套接字作为锁,因为它由每个工作人员共享。

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

如果MyClass确实需要访问套接字,请在doStuff中执行相同的同步。

但是,您有效地序列化对套接字的访问并绕过应用程序的多线程方面,因为在run方法的整个持续时间内保持锁定。