今天分享一道2024年技术面试的场景题。
对线程安全问题的理解?
线程安全问题是指在多线程环境下,多个线程同时访问和修改共享资源时可能产生的数据不一致或者不可预期的结果。
具体表现为原子性、有序性、可见性这三种情况。
原子性呢,是指当一个线程执行一系列程序指令操作的时候,它应该是不可中断的,因为一旦出现中断,站在多线程的视角来看,这一系列的程序指令会出现前后执行结果不一致的问题。
可见性,就是说在多线程环境下,由于读和写是发生在不同的线程里面,有可能出现某个线程对共享变量的修改,对其他线程不是实时可见的。
有序性,指的是程序编写的指令顺序和最终CPU运行的指令顺序可能出现不一致的现象,这种现象也可以称为指令重排序,所以有序性也会导致可见性问题。
这三个问题该如何解决呢?
对于原子性问题,可以使用Synchronized同步锁、ReentrantLock重入锁、Atomic原子类等
可见性问题可以使用volatile关键字修饰
有序性问题可以使用volatile、final关键字
而Synchronized和Lock这种锁的机制是可以同时解决这三类问题的,因为它相当于把多线程并行执行的逻辑改成了串行执行,从根上杜绝了线程安全问题。
说一下见到过的使用volatile关键字的场景
- 在基于双重检查锁的单例模式中使用volatile不免生成不完整对象的问题
- AQS中的status状态标识
- ConcurrentHashMap中的Node数组、 在TreeBin中的控制状态变量
相信大家对今年的面试情况有了清晰的了解,刷八股文能找到工作的时代已经过去了。
如今的面试题更多考察的是对某个技术的深度思考和理解。
今天的分享就到这里,也欢迎大家在评论区留言你们遇到过的奇葩面试题。
我是Mic,感谢大家的关注和收藏,我们下期再见。