【问题标题】:Java Thread accessing another ThreadJava 线程访问另一个线程
【发布时间】:2014-08-29 22:42:47
【问题描述】:

我有两个实现 Runnable 接口的对象。

假设我有 Thread_1Thread_2 对象。

Thread_1 具有全局变量 myVariable; 和使用 myVariable 变量的方法 myMethod()。 p>

Thread_2 具有 Thread_1

类型的变量

所以这里是场景:

两个线程:Thread_1Thread_2 正在运行。

如果 Thread_1 当前正在使用 myMethod()(它使用 myVariable)并且同时使用 Thread_2正在使用 Thread_1myVariableThread_1(不调用 myMethod() 方法)我应该同步 myVaribale 变量与否?

【问题讨论】:

  • 你为什么不放一些示例代码?尽可能接近真实代码。

标签: java multithreading synchronization thread-safety thread-synchronization


【解决方案1】:

如果使用意味着写入内存,你应该synchronize。您可能也想考虑原子。

另外,你不应该把你的变量和方法放在Threads 中。子类 Thread 仅当您想添加特定于线程的功能并将其余部分留给 Runnables 或组成您的系统的任何其他类时。

【讨论】:

    【解决方案2】:

    如果 Thread_1 当前正在使用 myMethod()(它使用 myVariable)并且同时 Thread_2 正在使用 Thread_1 的 myVariable --> 那么他们都使用它吗?一个是直接的,一个是通过方法的?

    在这种情况下,变量在线程之间共享,您需要确保读取/写入发生原子。 make 要么是 volatile,要么是它的 AtomicXXX 类,或者使用显式锁。

    附:一个线程是另一个线程的成员?有趣的设计

    【讨论】:

    • @JoroSeksa 如果你告诉我们你想做什么可能会更有意义。
    • 我正在开发消息交换系统,但在我的情况下,我通过不同的对象发送和接收消息。其中一个对象是客户端套接字,另一个是服务器套接字。服务器套接字使用客户端套接字发送定期 ping :)
    【解决方案3】:

    “我是否应该同步 myVaribale 变量?”

    这实际上取决于您的代码尝试归档的内容以及变量的类型(如果它是类还是原始类型)。同步必须是一个本地和特定问题的威胁,大多数时候你没有一个标准的程序可以使用。

    我可以告诉你的是,这个全局变量myVariable应该是volatile,以确保两个线程都能看到所有修改。

    【讨论】:

      【解决方案4】:

      无论您如何访问 myVariable。只要您从多个线程访问它(任何变量),您就必须确保其线程安全、简单。您可以根据您要实现的目标使用 volatile、AtomicReference、lock 或 synchronize,这些方法中的任何一种。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-19
        • 1970-01-01
        • 2018-09-22
        • 1970-01-01
        • 1970-01-01
        • 2021-07-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多