【问题标题】:Which variables are accessbile for multiple threads in java?java中的多个线程可以访问哪些变量?
【发布时间】:2018-10-05 07:38:47
【问题描述】:

我正在处理一个简单的消息队列,我正在为新连接创建单独的线程。我想知道哪些变量是可访问的,并且可以被多个线程修改。

class RequestHandler implements Runnable {

    Socket socket;

    protected RequestHandler(Socket socket) {
        this.socket = socket;
    }

    public void run() { ..........

上面的代码是socket可以被多个线程访问,如果是那么我该如何保护它。

完整的代码可在以下位置获得。 https://github.com/nakshay/JQueue

我是多线程新手,如有需要请修改问题。

【问题讨论】:

  • 任何非局部变量都可以被多个线程访问,前提是这些线程具有对其所属实例的引用(或可以静态访问该成员)。
  • 这似乎是个坏主意。为什么不为每个套接字设置一个单独的线程? stackoverflow.com/a/6672647/14955
  • @AndyTurner 的评论在技术上是正确的,因为任何数量的线程都可以访问他们引用的任何字段,但是为了确保对这些字段的更新正确可见,您必须考虑线程同步(final 不可变或synchronizedvolatile 等)。

标签: java multithreading


【解决方案1】:

如果套接字变量可以被多个线程访问,您需要同步访问该变量。

其中一种方法是创建一个包装器,它基本上会同步方法调用[1]。

然后在构造函数中包装你的套接字:

class RequestHandler implements Runnable {

    Socket socket;

    protected RequestHandler(Socket socket) {
        this.socket = new SynchronizedSocket(socket);
    }

    public void run() { ..........

[1] - https://gist.github.com/Sammers21/a6635213276e9ea064a5a4f20dd53c11

【讨论】:

    【解决方案2】:

    帖子中未显示:您实际上为每个线程创建了一个新的 RequestHandler 和 Socket,因此由于套接字不是静态的,所以您很好。每个线程处理自己的连接(由 Socket 表示)。

    【讨论】:

      猜你喜欢
      • 2016-02-20
      • 1970-01-01
      • 2013-08-31
      • 1970-01-01
      • 2018-07-03
      • 1970-01-01
      • 1970-01-01
      • 2020-11-09
      • 1970-01-01
      相关资源
      最近更新 更多