在Java中切换易失性布尔值

时间:2020-06-29 16:21:43

标签: java

我注意到下面的代码并没有像预期的那样切换标志(在调用toggleFlag之后,标志值保持不变)。为什么会这样?

private static volatile boolean flag;

static synchronized void toggleFlag() {
   flag = !flag;
}

2 个答案:

答案 0 :(得分:2)

您放置的代码不可能编译,保持运行状态。

您的代码有多个错误,例如

  1. 您无法通过non-static方法(在这种情况下为flag)访问static变量(在这种情况下为toggle())。
  2. toggle()方法的正确声明是static synchronized void toggle()

正确的代码:

private static volatile boolean flag;

static synchronized void toggle()
{
 flag = !flag;
}

谢谢。

答案 1 :(得分:1)

您不能将this与静态变量一起使用。

在静态块或静态方法中,没有实例可引用,因此不允许使用this关键字。

检查一下:

private static volatile boolean flag;

    static synchronized void toggleFlag() {
        flag = !flag;
    }

来自docs.oracle.com:

并非允许实例和类变量以及方法的所有组合:

  • 实例方法可以访问实例变量和实例方法 直接。
  • 实例方法可以访问类变量和类方法 直接。
  • 类方法可以直接访问类变量和类方法。
  • 类方法不能直接访问实例变量或实例方法,它们必须使用对象引用。另外,类方法不能 请使用this关键字,因为没有可引用的实例。

链接:https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

UPD。创建boolean变量(例如private static volatile boolean flag;)时,默认情况下它将变为false。因此,使用此代码toggleFlag();表示!false

您可以检查“原始数据类型”中的“默认值”部分,以获取有关类成员默认值的更多信息。

链接:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html