影响Java中不同类中的变量
Posted
技术标签:
【中文标题】影响Java中不同类中的变量【英文标题】:Affecting variables in different classes in Java 【发布时间】:2017-08-31 22:08:24 【问题描述】:我有两个类,我试图用它们来操作一个变量,例如
public class A
public static void main(String[] args)
while(game_over[0] == false)
System.out.println("in the while-loop");
System.out.println("out of the while-loop");
static boolean[] game_over = false;
和
public class B
public boolean[] game_over;
public printBoard(boolean[] game_over)
this.game_over = game_over;
public void run()
for (int i = 0; i < 10; i++)
// do something
game_over[0] = true;
System.out.println("GAME OVER");
提供的代码 sn-ps 并不意味着是实际可行的代码,我更关心这个概念。在我的程序中,A 类创建了一个使用 B 类的线程,我希望 B 类影响变量“game_over”,这样 A 类中的 while 循环将受到更改的影响......知道我如何能成功更新变量?谢谢。
【问题讨论】:
拥有一个外部变量有什么意义?为什么不定义一个方法 B.isGameOver()? @MauricePerry 我不知道 laroy 的原因,但一般来说,可能有很多组件可以决定游戏结束,避免 A 不得不检查每个可能导致游戏结束的组件决策,提供一定程度的间接性实际上是个好主意。 @ErwinBolwidt 好的,在这种情况下,向他们传递一个 GameStatus 或 GameMonitor 类的对象,而不是布尔值。 【参考方案1】:不要为此使用数组,这会使确保应用程序无数据争用变得更加困难。
由于您希望能够将game_over
标志作为独立对象传递,因此实现正确的多线程应用程序的最简单方法是使用AtomicBoolean
类。
import java.util.concurrent.atomic.AtomicBoolean;
class B
private AtomicBoolean game_over;
public B(AtomicBoolean game_over)
this.game_over = game_over;
public void run()
// do stuff
game_over.set(true);
在你的 A 班:
public class A
static AtomicBoolean game_over = new AtomicBoolean();
public static void main(String[] args)
B b = new B();
Thread t = new Thread(b);
t.start();
while (!game_over.get())
System.out.println("in the while-loop");
System.out.println("out of the while-loop");
【讨论】:
好答案。另一种选择是将 game_over 声明为volatile
我可以看到这是如何工作的,但是在 A 类中创建 AtomicBoolean 时遇到了问题
@alfasin 仅当它不是数组时才有效。因为它是一个数组,所以 volatile 只影响对 game_over 数组引用的读取操作,而不影响稍后对数组第一个元素的写入操作 - 所以仍然不能保证 A 类中的主循环会看到更新。
确实,在我看来,我使用的不是数组,而是一个简单的boolean
值:)))以上是关于影响Java中不同类中的变量的主要内容,如果未能解决你的问题,请参考以下文章
java中不同类如何相互访问变量值(新手见解,可能很low)