java - 多线程同步对象

标签 java multithreading

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

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

这是我需要的草稿:

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 方法的整个持续时间内都持有锁,因此您有效地序列化了对套接字的访问并绕过了应用程序的多线程方面。

关于java - 多线程同步对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20529196/

相关文章:

java - 使用 native 查询公开端点而不创建实体

c - 如果我 fork() 然后执行 execv(),谁拥有控制台?

android - 声明多个 Handler 实例是否会创建多个队列?

c++ - 如何在 QT 中使用互斥锁定线程开始轮询?

c# - "using"方法内的语句会导致数据损坏或访问冲突的麻烦?

java - JSF 无法获取带参数的方法返回值的属性

java - 自动滚动 ListView?

java - 我的游戏有问题

java - 使用 commons-cli 解析命令行时的同义词

c# - .NET 中是否可以使用 C# 实现基于事件的异步模式而无需多线程?