0

我有一个 A 类,它有一个 B 类对象。B 类有一个布尔变量 bool,A 实例不断更新(关闭事件)。B 对象 b 实现 Runnable。

class A{
  private B b;
}

class B implements Runnable{
  private boolean bool;

  run(){
    while(true){
      if(bool){//do something}
    }
  }
}

我假设 boolean bool 实际上在 a 的线程上,因为它在 a 调用 B 的构造函数时被初始化,并且 b 线程直到在 b 实例上调用 start 才开始,并且直到 bool 被初始化后才调用 start。

如果是这种情况,那么 b 线程必须保留它自己的 bool 副本。如果是这种情况,从 a 更改 bool 以使 b 线程可以看到它的最快方法是什么?使 bool 不稳定,或者有什么方法可以直接分配给 b 的副本?

请忘记循环,它适用于 GLES20。我需要知道的是 b 是否有它的 bool 副本,以及事件线程在 GL 线程上不断更新布尔值的最快方法是什么。

4

2 回答 2

1

如果在某个阶段对变量的读取和写入可以在不同的线程上,则需要某种形式的同步。在这种情况下,最明智的选择是:

但是,根据您的用例,可能有更好的方法来实现您的目标,方法是使用适当的并发对象(例如锁存器、信号量或队列)并避免不必要地使用许多 CPU 周期的忙等待。

于 2013-01-15T23:28:37.970 回答
0

Java 的 Exchanger 似乎是我所需要的。它在线程之间建立一个对象,而不是在每个事务中生成一个新对象并在事务之后对它进行 GC。

这里有一个很好的解释和代码:

http://www.javacodegeeks.com/2011/09/exchanger-and-gc-less-java.html

于 2013-01-16T21:46:50.793 回答