在多个不同线程之间共享变量

use*_*431 19 java multithreading synchronization shared

我想在多个线程之间共享一个变量,如下所示:

boolean flag = true;
T1 main = new T1();
T2 help = new T2();
main.start();
help.start();
Run Code Online (Sandbox Code Playgroud)

我想flag在main和help线程之间共享,这些是我创建的两个不同的Java类.有办法做到这一点吗?谢谢!

Bri*_*new 29

二者T1T2可以参照包含该变量的类.然后,您可以将此变量设置为volatile,这意味着在两个线程中都可以立即看到对该变量的更改.

有关详细信息,请参阅此文章.

易失性变量共享同步的可见性特征,但没有原子性特征.这意味着线程将自动查看volatile变量的最新值.它们可用于提供线程安全性,但仅限于非常有限的一组情况:那些不在多个变量之间或变量的当前值与其未来值之间施加约束的情况.

并注意使用volatile与更复杂的共享状态的方法的优缺点.


Old*_*eon 15

除了其他建议之外 - 您还可以将标志包装在控件类中,并在父类中创建它的最终实例:

public class Test {
  class Control {
    public volatile boolean flag = false;
  }
  final Control control = new Control();

  class T1 implements Runnable {
    @Override
    public void run() {
      while ( !control.flag ) {

      }
    }
  }

  class T2 implements Runnable {
    @Override
    public void run() {
      while ( !control.flag ) {

      }
    }
  }

  private void test() {
    T1 main = new T1();
    T2 help = new T2();

    new Thread(main).start();
    new Thread(help).start();
  }

  public static void main(String[] args) throws InterruptedException {
    try {
      Test test = new Test();
      test.test();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


Bug*_*ggy 7

使用static不会帮助你的情况。

synchronize当一个变量被另一个线程使用时,Using 会锁定它。

您应该使用volatile关键字来保持变量在所有线程之间更新。

使用 volatile 是使类线程安全的另一种方式(如同步、原子包装)。线程安全意味着一个方法或类实例可以被多个线程同时使用,没有任何问题。


小智 5

  1. 将其设为静态可以解决此问题。
  2. 引用其他线程中的主线程并使该变量可见


NPE*_*NPE 5

为了使其在和的实例之间可见T1T2您可以使两个类包含对包含变量的对象的引用。

如果要在线程运行时修改变量,则需要考虑同步。最佳方法取决于您的确切要求,但是主要选项如下:

  • 使变量volatile;
  • 把它变成一个AtomicBoolean;
  • 在使用同步的代码周围使用成熟的同步。