5. 三个线程如何实现交替打印ABC
6. 操作系统进程间通信方式?
管道、FIFO、消息队列、信号量、共享内存区
7. 线程间通信方式?
在java中,多个线程是通过写-读内存中的公共资源进行通信的。
8. 线程交互方式?
wait()、notify()
9. 怎么控制线程尽可能减少上下文切换?
无锁并发编程、CAS 算法、使用最少线程、使用协程
10. 守护线程、僵尸进程、孤儿进程,如何创建守护进程
- 守护线程:是一种特殊的线程,用于完成一些系统性的任务,如果一个java应用只有守护线程,java虚拟机就会退出。
- 僵尸进程:如果子进程已经终止,但是其父进程还没有获取其状态,这个进程就称之为僵尸进程.
- 孤儿进程:如果父进程先退出,子进程还没退出,那么这些子进程将成为孤儿进程,孤儿进程会被init进程收养。
- 如何创建守护线程:在调用线程的start()方法之前调用setDaemon()方法
11. 怎么优化锁(提高锁的性能)?
- 减小锁持有时间
- 减小锁粒度
- 读写分离锁来替换独占锁
- 锁粗化
- 另外java虚拟机内部也对锁进行了优化:偏向锁、轻量级锁、自旋锁、锁清除
12. 多线程底层原理?
多个线程竞争CPU时间片,哪个线程获取了CPU时间片,就执行哪个线程。
13. 除了锁调度线程,还有什么方法调度线程?
sleep、wait、notify、notifyAll
14. 什么是公平锁,什么是非公平锁?
- 公平锁:线程获取锁的顺序是按照线程申请锁的顺序来分配的,即先来先得的FIFO先进先出顺序
- 非公平锁:线程获取锁的顺序是随机的,不是先到先得,导致某些线程可能一直拿不到锁,所以是不公平的
15. 停止线程的方法
- 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。
- 使用stop方法强行终止线程。
- 使用interrupt方法中断线程。
16. 为什么使用stop停止线程不安全?
- 使用stop方法结束线程时,会直接终止线程,停止剩余的全部工作,包括在catch或finally语句中的,因此可能会导致一些清理性的工作的得不到完成,如文件,数据库等的关闭。
- 使用stop停止会立即释放这个线程所持有的锁,导致数据得不到同步,可能会出现数据不一致的问题。
17. 协程是什么?线程与协程的区别?协程有哪些优势?把所有多线程都替换成协程可以嘛?
- 协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。
- 区别:
①协程属于线程,一个线程可以有多个协程,协程是用户态的轻量级线程。
②线程进程都是同步机制,而协程则是异步。
③线程是抢占式,而协程是非抢占式的。
④协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态。 - 优势:没有线程切换的开销,上下文的切换非常快。
18. happen before原则
- 程序顺序原则:在一个线程内一段代码的执行结果是有序的。
- volatile变量规则:就是如果一个线程先去写一个volatile变量,然后一个线程去读这个变量,那么这个写操作的结果一定对读的这个线程可见。
- 锁规则:解锁必然发生在随后的加锁前。
- 传递规则:A先于B,B先于C,那么A必然先于C。
- 线程的start()方法先于它的每一个操作。
- 线程的所有操作先于线程的终结。
- 线程的中断先于被中断的代码。
- 构造函数的执行的结束先于finalize()方法。