文章目录
- 快速回忆
- 一、谈谈Volatile
- 二、CAS 底层原理
- 三、ABA问题
- 四、集合类不安全
- 五、Java的几个重要的锁
- 六、JUC常见的几个包
- 七、阻塞队列
- 八、生产者与消费者问题
- 九、Synchronized锁与Lock锁的区别
- 十、创建线程的四种方式
- 十一、Callable接口
- 十二、线程池
- 十三、线程池面试题
- 十四、死锁排查
- 十五、异步回调
- 十六、CompletableFuture的使用
- 十七、其它面试题
-
-
- 池化技术简介
- 现在有三个线程T1,T2,T3,怎么保证线程按照T1,T2,T3的顺序顺序执行?
- 线程安全
- Java线程池中submit() 和 execute()方法有什么区别?
- 说一下线程之间是如何通信的?
- 常见的并发容器?
- 常见的同步工具类?
- 说说自己是怎么使用 synchronized 关键字
- 构造方法可以使用 synchronized 关键字修饰么?
- 为什么我们调用 start() 方法时会执行 run() 方法,为什么我们不能直接调用 run() 方法?
- 什么是悲观锁?什么是乐观锁?
- sleep() 方法和 wait() 方法的区别和共同点?
- ThreadLocal 了解么?
- ThreadLocal 内存泄露问题了解不?
- 线程池如何知道一个线程的任务已经执行完成?
- 讲一下 wait 和 notify 这个为什么要在synchronized 代码块中?
- 什么是守护线程,它有什么特点
-
快速回忆
Volatile 的特征
- 保证可见性
- 不保证原子性
- 禁止指令重排序
private volatile static AtomicInteger num = new AtomicInteger();
其中volatile保证让多个线程都能看得见num这个变量(保证可见性),AtomicInteger则是为了保证多个线程并发修改时不会数据错乱(保证原子性);
所以说