- 线程基础
- 有多少中实现线程的方法?
- 实现Runnable接口和继承Thread类哪种方式更好?
- 一个线程两次调用start()方法会出现什么情况?为什么?
- 既然start()方法会调用run()方法,为什么我们会选择start()方法,而不是直接调用run()方法啦?
- 如何停止线程
- 如何处理不可中断的阻塞
- 线程有哪几种状态?生命周期是什么?
- 用程序实现两个线程交替打印0~100奇偶数
- 手写生产者消费者设计模式
- 为什么wait()需要在同步代码块中使用,而sleep()不需要
- 为什么线程通信的方法wait(),notify(),notifyAll()被定义在Object类里?而sleep定义在Thread类里
- wait()是属于Object对象的,那调用Thread.wait()会怎样?
- 如何选择用notify还是notifyAll
- notifyAll之后所有线程都会再次抢夺锁,如果某线程抢夺失败会怎样?
- 用suspend()和resume()来阻塞线程可以吗?为什么?
- wait/notify、sleep异同
- 在join期间,线程处于哪种状态?
- 守护线程与普通线程的区别
- run方法是否可以抛出异常?如果抛出异常,线程状态会怎么样?
- 线程中如何处理某个未处理异常
- 你知道有哪些线程不安全的情况
- 平时哪些情况下需要额外注意线程安全问题
- 什么是多线程的上下文切换
- 内存模型
- 死锁
线程基础
有多少中实现线程的方法?
实现Runnable接口和继承Thread类哪种方式更好?
一个线程两次调用start()方法会出现什么情况?为什么?
既然start()方法会调用run()方法,为什么我们会选择start()方法,而不是直接调用run()方法啦?
如何停止线程
如何处理不可中断的阻塞
线程有哪几种状态?生命周期是什么?
用程序实现两个线程交替打印0~100奇偶数
手写生产者消费者设计模式
解答思路先说清楚,在哪种场景需要使用这种模式
为什么wait()需要在同步代码块中使用,而sleep()不需要
wait机制设计之初的目的就是先wait,再notify唤醒,使用同步代码块是为了保证通信的可靠,防止notify在wait之前调用,导致的业务异常和永久等待,死锁,
而sleep不涉及到其他线程,所以无此问题
为什么线程通信的方法wait(),notify(),notifyAll()被定义在Object类里?而sleep定义在Thread类里
这组方法是锁级别的操作,而锁是属于某一对象的,每个对象头中都有几位是用来保存锁的状态的,所以锁是绑定到某一对象中,并不是线程中
某一线程持有多个锁,并且这些锁之间是相互配合的,如果定义在Thread类里,将只有一把锁,无法实现持有多把锁灵活逻辑
wait()是属于Object对象的,那调用Thread.wait()会怎样?
线程在退出时,会执行notify,这会使wait逻辑异常
如何选择用notify还是notifyAll
唤醒一个线程还是唤醒所有线程
notifyAll之后所有线程都会再次抢夺锁,如果某线程抢夺失败会怎样?
进行等待状态
用suspend()和resume()来阻塞线程可以吗?为什么?
wait/notify、sleep异同
相同
- 阻塞
- 响应中断
不同
- 同步方法中
- 释放锁
- 指定时间
- 所属类
在join期间,线程处于哪种状态?
守护线程与普通线程的区别
作用
jvm在停止时,不需要考虑守护线程
run方法是否可以抛出异常?如果抛出异常,线程状态会怎么样?
线程中如何处理某个未处理异常
你知道有哪些线程不安全的情况
平时哪些情况下需要额外注意线程安全问题
什么是多线程的上下文切换
内存模型
JMM应用实例:单例模式8种写法、单例和并发关系(高频考点)
讲一讲什么是内存模型
volatle和synchronized的异同
什么是原子操作?java中有哪些原子操作?生成对象的过程是不是原子操作?
一个操作指令或者一组操作指令要么全部完成要么全部不完成而不能完成一半
java有三种原子操作
生成对象不是原子的,分三步
- 新建一个空对象,
- 执行构造函数,
- 把对象地址赋值给引用
什么是内存的可见性
cpu结构,多层缓存,不同缓存之间值不一致,使用JMM规范来解决问题