Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多线程中的同步对象_Java_Multithreading - Fatal编程技术网

Java 多线程中的同步对象

Java 多线程中的同步对象,java,multithreading,Java,Multithreading,我有一个创建多个线程的类,每个线程在构造函数中获得一个套接字作为参数 我需要同步线程,以便在给定时间只有一个线程访问套接字流 以下是我需要的快速草稿: class MyClass{ Socket socket; public MyClass() { socket = new Socket(address, port); } void createThread(){ Worker worker = new Worker(socke

我有一个创建多个线程的类,每个线程在构造函数中获得一个套接字作为参数

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

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

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
中执行相同的同步


但是,您实际上是在序列化对套接字的访问,并绕过应用程序的多线程方面,因为锁在
运行
方法的整个过程中一直保持着。

也许最好有一个对套接字具有独占访问权的套接字访问类,该类存储所有传入数据。然后,工作人员以同步方式访问此数据