面试题答案
一键面试volatile关键字
- 作用机制:volatile通过内存屏障实现,禁止指令重排序,并确保对volatile变量的修改会立即刷新到主内存,其他线程读取时会从主内存获取最新值。
- 可见性:保证可见性,一个线程修改了volatile变量,其他线程能立刻看到最新值。
- 原子性:不保证原子性,对于复合操作(如i++)不具备原子性。
- 有序性:保证有序性,禁止指令重排序,确保代码执行顺序与书写顺序一致。
- 适用场景:适用于一写多读场景,如状态标记变量,主要关注可见性和禁止指令重排序。
synchronized关键字
- 作用机制:通过对象监视器(monitor)实现,线程获取monitor才能进入同步块或方法,执行完释放monitor。
- 可见性:保证可见性,线程进入同步块时会从主内存刷新变量值,退出时会将变量值写回主内存。
- 原子性:保证原子性,同一时刻只有一个线程能进入同步块或方法,操作具有原子性。
- 有序性:保证有序性,相当于一个内存屏障,禁止指令重排序。
- 适用场景:适用于多线程读写场景,需要保证原子性、可见性和有序性,如临界区资源访问。
选择建议
- 优先使用volatile的场景:变量的操作不涉及复合操作,且主要关注变量的可见性和禁止指令重排序,如标记位判断。
- 优先使用synchronized的场景:需要保证原子性操作,多线程对共享资源读写,需要同步互斥控制,如并发修改数据结构。