在 Java 中切换易失性布尔值



我注意到以下代码没有按预期切换标志(调用 toggleFlag 后标志值保持不变(。为什么会这样呢?

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

你输入的代码不可能编译,保持运行。

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

  1. 您无法从static方法(在本例中为toggle()(访问non-static变量(在本例中为flag(。
  2. 正确声明toggle()方法是,static synchronized void toggle()

正确的代码:

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

谢谢。

不能将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

上。当您创建boolean变量(如private static volatile boolean flag;(时,默认情况下它会变得false。因此,使用此代码toggleFlag();意味着!false

可以查看基元数据类型中的"默认值"部分,了解有关类成员默认值的详细信息。

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

最新更新