影响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)

来自 Android 中不同类的 setContentView(R.layout.xy)

可视化Java框架中不同类和接口之间的关系

从 Java 中的两个不同类中设置和获取静态变量

更改对不同类加载器加载的单例类的影响

访问不同类中的 Spark 广播变量