场景:
在练习
错题
错题1描述:
关于访问权限说法正确 的是 ? ( )
A. 外部类前面可以修饰public,protected和private
B. 成员内部类前面可以修饰public,protected和private
C. 局部内部类前面可以修饰public,protected和private
D. 以上说法都不正确
原因分析:
B选项,成员内部类相当于成语变量 可以使用public,protected和private
C 选项 局部内部类相当于局部变量,不可以使用修饰符
答案:B
错题2描述:
以下代码的输出结果是?
public class B
{
//坑
public static B t1 = new B();
public static B t2 = new B();
{
System.out.println("构造块");
}
static
{
System.out.println("静态块");
}
public static void main(String[] args)
{
B t = new B();
}
}
选项
A. 静态块 构造块 构造块 构造块
B. 构造块 静态块 构造块 构造块
C. 构造块 构造块 静态块 构造块
D. 构造块 构造块 构造块 静态块
原因分析:
这题有坑,有静态域,会顺序执行static所修饰的变量
答案:C
错题3描述:
关于volatile关键字,下列描述不正确的是?
A. 用volatile修饰的变量,每次更新对其他线程都是立即可见的。
B. 对volatile变量的操作是原子性的。
C. 对volatile变量的操作不会造成阻塞。
D. 不依赖其他锁机制,多线程环境下的计数器可用volatile实现。
原因分析:
一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:
1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。
2)禁止进行指令重排序。
volatile只提供了保证访问该变量时,每次都是从内存中读取最新值,并不会使用寄存器缓存该值——每次都会从内存中读取。
而对该变量的修改,volatile并不提供原子性的保证。
由于及时更新,很可能导致另一线程访问最新变量值,无法跳出循环的情况
多线程下计数器必须使用锁保护。
答案:B D