我注意到下面的代码并没有像预期的那样切换标志(在调用toggleFlag之后,标志值保持不变)。为什么会这样?
private static volatile boolean flag;
static synchronized void toggleFlag() {
flag = !flag;
}
答案 0 :(得分:2)
您放置的代码不可能编译,保持运行状态。
您的代码有多个错误,例如
non-static
方法(在这种情况下为flag
)访问static
变量(在这种情况下为toggle()
)。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