【问题标题】:How to use shared memory on Java threads?如何在 Java 线程上使用共享内存?
【发布时间】:2012-11-29 14:48:54
【问题描述】:

我正在用 Java 实现一个多线程程序,其中每个 thread 的类型为 class Node extends Thread

所有这些类都会生成某些值,这些值将被其他类使用。

对于main,很容易从生成的threads 中获取值,但从threads 本身内部,我如何获取其他threads 上的值?

//Start the threads from a list of objects
for (int i = 0; i < lnode.size(); i++) { 
    lnode.get(i).start();
}

谢谢

【问题讨论】:

  • 单个进程中的所有线程默认共享所有内存,并且可以随时访问这块内存中的任何一个。
  • 请停止这种扩展 Thread 而不是实现 Runnable 的可怕做法。

标签: java multithreading class multiprocessing shared-memory


【解决方案1】:

如果你这样做:

class MyThreadRunnable implements Runnable {
    List<String> strings;

    MyThreadRunnable(List<String> strings) {
        this.strings = strings;
    }

    public void run() {
        strings.add(getName());
    }
}

// ...

List<String> sharedStrings = new ArrayList<String>();
Thread t1 = new Thread(new MyThreadRunnable(sharedStrings));
Thread t2 = new Thread(new MyThreadRunnable(sharedStrings));

t1.start();
t2.start();

那么t1t2(同一类型的两个不同线程)都将使用同一个列表,并查看另一个线程对其所做的更改。

实际上,因为为了简洁起见,我没有使用任何同步,所以这也可能会以某种不可预测的方式破坏列表并导致奇怪的错误。我强烈建议您研究进程同步以及处理并发时的 java.util.concurrent 包。

【讨论】:

    【解决方案2】:

    如果是同一进程/jvc 实例的线程,您将不需要“共享内存”,您只需要在线程中引用您的数据,例如通过构造函数或静态引用。 但是,如果多个线程写入该数据,您将需要一种同步/控制访问机制。

    【讨论】:

      【解决方案3】:

      听起来您正在寻找ConcurrentHashMap,但如果没有更多细节就很难分辨。

      您希望在这些线程之间共享什么样的数据?他们需要如何共享这些数据?

      顺便说一句 - 通常认为实现 Runnable 比扩展 Thread 更好。

      【讨论】:

        【解决方案4】:

        您可以使用ThreadLocal 共享变量。 ThreadLocal 的定义如下:

        Thread Local 可以认为是一个访问范围,就像一个请求 范围或会话范围。这是一个线程范围。您可以在其中设置任何对象 线程本地,此对象将是全局的,并且对于特定的本地 正在访问该对象的线程。

        您可以找到更多信息here

        【讨论】:

        • downvote:这似乎与答案完全相反。 ThreadLocal 不在线程之间共享,而是在线程内共享。问题是,“我怎样才能获得其他线程上的值?”
        猜你喜欢
        • 1970-01-01
        • 2014-04-19
        • 2020-02-23
        • 1970-01-01
        • 2014-10-01
        • 2012-01-11
        • 2016-03-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多