从多个线程访问同一对象实例

Mar*_*819 1 java concurrency multithreading javafx

我正在 JavaFX 中开发应用程序,并且具有以下结构,其中包含在控制器类中创建的对象“config”,然后我从扩展原始控制器类的两个类以及其他线程访问配置。

public class Controller {

    protected Config config = new Config();

    private void setupConfig() {
        var machineStatus = new MachineStatus();
        machineStatus.setRemainingTime(25);
        machineStatus.setMessage("Running");
        config.setMachineStatus(machineStatus);
    }
}


public class MainController extends Controller {
    Thread taskThread = new Thread(new Runnable() {
                @Override
                public void run() {
                    while(true) {
                        var newStatus = getNewStatus();          // Returns new status containing different RemainingTime and Message value every time
                        config.setMachineStatus(newStatus);
                        Thread.sleep(10000);
                    }
                }
    });
    taskThread.start();
}


public class StatusController extends Controller {
    System.out.println(config.getMachineStatus().getRemainingTime()) // Always prints 25
    System.out.println(config.getMachineStatus().getMessage())      // Always prints "Running"
}


public class Config {
    private MachineStatus machineStatus;

    public MachineStatus getMachineStatus() {
        return machineStatus;
    }

    public void setMachineStatus(MachineStatus value) {
        machineStatus = value;
    }
}

public class MachineStatus {
    private int remainingTime;
    private String message;

    public int getRemainingTime() {
        return remainingTime;
    }

    public void setRemainingTime(int value) {
        remainingTime = value;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String value) {
        message = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想实现这一点,当我在 StatusController 中调用 getRemainingTime() 或 get Message() 时,我将始终获得写入配置变量中的最新状态。但相反,我仍然获得变量初始化时存储的初始值。

第二个线程每 10 秒运行一次,并始终使用新机器状态更新配置变量。即使我让第二个线程运行几分钟,在 StatusController 中,我总是会获得初始值。

有人可以帮助我如何实现这一目标吗?

小智 6

啊,明白了。看起来您认为 StatusController 和 MainController 访问同一个 Config 实例。但事实并非如此。

StatusController extends Controller
MainController extends Controller
Run Code Online (Sandbox Code Playgroud)

每个控制器都有自己的 Config 对象实例。这意味着 MainController 更改了 MainController 的配置。但 StatusController 有自己的 Config。您需要访问 MainController 的配置并打印其状态。

第二个问题。配置不是线程安全的。由于CPU缓存等原因,您可能看不到线程的变化。您可以使用任何同步概念来解决它。

rzwitserloot - 已经回答了...