【问题标题】:Is a class without fields thread safe没有字段的类是线程安全的吗
【发布时间】:2016-02-12 10:56:09
【问题描述】:

如果我创建一个只有方法而没有变量的类,并且每个方法都有自己的局部变量,那么该类是否是线程安全的?例如。

   public class Client {

                public String xyz(final String inputXML) {
                      DataInputStream dis = null;
                      DataOutputStream dout = null;
                      Socket clientSocket = null;
                        //do some processing 
                    }

                public String abc(final String inputXML) {
                      DataInputStream dis = null;
                      DataOutputStream dout = null;
                      Socket clientSocket = null;
                        //do some processing 
                    }
        }

现在如果我启动这个客户端的多个线程,那么这个类会是线程安全的吗?

【问题讨论】:

  • 它是线程安全的,但是如果您尝试从多个线程打开同一个套接字,您仍然会遇到并发问题。
  • 这不是同一个 Socket,因为对这些方法的不同调用之间没有共享数据。如果在每个线程中创建一个新的 Socket,它将在客户端的不同端口上工作,因此不会在套接字连接之间混合数据。套接字由服务器的 ip 端口和客户端的端口 ip 标识。这种情况下客户端的端口会发生变化

标签: java multithreading thread-safety


【解决方案1】:

是的,你的类是线程安全的。

一个方法是线程安全的,如果:

  • 无权访问共享变量
  • 访问共享的不可变变量
  • 访问只能以线程安全方式(例如通过同步方法)修改状态的变量
  • 使用同步块访问使用相同变量的其他线程的相同锁的变量

您的方法无法访问共享变量,因此线程安全

【讨论】:

    【解决方案2】:

    理论上是的,实际上它取决于变量的值是独立实例还是指向系统中某处的相同实例

    【讨论】:

      猜你喜欢
      • 2019-05-21
      • 1970-01-01
      • 1970-01-01
      • 2011-08-03
      • 2011-05-18
      相关资源
      最近更新 更多