我注意到以下代码没有按预期切换标志(调用 toggleFlag 后标志值保持不变(。为什么会这样呢?
private static volatile boolean flag;
static synchronized void toggleFlag() {
flag = !flag;
}
你输入的代码不可能编译,保持运行。
您的代码有多个错误,例如,
- 您无法从
static
方法(在本例中为toggle()
(访问non-static
变量(在本例中为flag
(。 - 正确声明
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