【问题标题】:Cannot assign value to static integer无法为静态整数赋值
【发布时间】:2014-12-31 12:57:13
【问题描述】:

我正在处理一个带有线程的项目。这是我主要课程的开始。

public class Main {
    public static int firstIndex, secondIndex, thirdIndex, fourthIndex, fifthIndex;

然后我创建一个线程并覆盖它的 run() 函数。在 run() 中,我尝试将整数分配给我之前定义的静态整数变量。

cThread thread1 = new cThread(ant) {
            @Override
            public void run() {
                try {
                    firstIndex = myAllocator.alloc(11, '1', this);
                    secondIndex = myAllocator.alloc(10, '2', this);

alloc() 函数内部返回正确的整数,但静态变量始终保持为 0,不会更改为函数返回的值。但是,如果我不将整数设为静态,则会出现以下错误:

Cannot make a static reference to the non-static field firstIndex.

我确信函数返回正确的值。问题是什么?非常感谢。

【问题讨论】:

  • 试试 Main.firstIndex。
  • 它不起作用,没有语法错误但它仍然保持在0。它也不会让我从静态变为普通整数。
  • 请,pleasePLEASE 阅读 一些 文档,了解 Java 中线程是如何工作的。您没有同步,也没有volatile。您的代码不起作用,这绝对不足为奇。
  • @YaseenKhan 但是你当然可以。
  • 您向我们展示的 run() 方法是在 内部 Main 类的某处吗?还是在其他班级?程序中的任何地方是否还有其他名为 firstIndex 的变量?如果您可以向我们展示一个其他人可以编译和运行的完整程序,其他人会更容易帮助您。但是,如果您尝试这样做,您可能会自己找到答案。

标签: java eclipse multithreading static


【解决方案1】:

检查以下事项:

  • 您正在运行线程。 thread1.start()
  • 您在线程完成后检查静态变量。毕竟线程的目的是并行运行,因此您可能会在线程有机会运行之前检查值。
  • 您需要同步。要么制作静态变量volatile,要么使用synchronized 块将您的登录信息包装在线程的run 方法中。您还需要在阅读时使用同步块。一个核心可能正确设置了这些值,但另一个核心正在尝试读取它们。如果没有同步,您无法保证两个核心都能看到正确的数据。 (由于缓存等)

【讨论】:

  • 是的,现在已修复。显然我试图使用在线程完成之前我将获得的整数,所以它永远不会分配。 :[
  • volatile 是一种极其弱的同步形式。如果您希望一个线程更新一个变量,而另一个线程读取更新后的值; volatile 将保证值从一个线程传播到另一个线程,但仅当读取实际发生在写入之后。使用volatile 并不能确保读取不会发生在写入之前。您需要wait()notify(),或者您需要一些基于类似等待/通知的原语构建的更高级别的构造,以确保读取和写入以正确的顺序发生。
  • @james large - volatile 只是一种同步机制,如 synchronized。它不保证读/写的顺序。这取决于开发人员所需的逻辑。他们可能有多次读/写,可能不需要等待任何事情,这可能对他们的用例有效。尽管如此,volatile 保证您将获得一个有效的旧值或新值,而不会介于两者之间。
  • 我总是会选择同步块,尽管它们更明确地说明了读取和写入的执行位置。如果想要更复杂的行为,他们绝对应该检查java.util.concurrent 包。
【解决方案2】:
  1. 如果您是从新线程分配值,则应等待线程完成后再读取值。

  2. 预期不同线程上的读取会看到写入需要线程同步。将变量定义为 volatile,或用锁保护它们。

【讨论】:

    【解决方案3】:

    不要将变量设为静态; 所以你会改变你的第一行代码

    public int firstIndex, secondIndex,...
    

    【讨论】:

      猜你喜欢
      • 2016-12-19
      • 1970-01-01
      • 2020-03-19
      • 1970-01-01
      • 2011-04-02
      • 1970-01-01
      • 1970-01-01
      • 2011-02-24
      相关资源
      最近更新 更多