我们都知道程序是按代码顺序执行的, 对于单线程来说确实是如此, 但在多线程情况下就不是如此了。 为
了优化程序执行和提高 CPU 的处理性能, JVM 和操作系统都会对指令进行重排, 也就说前面的代码并不一
定都会在后面的代码前面执行, 即后面的代码可能会插到前面的代码之前执行, 只要不影响当前线程的执行
结果。 所以,指令重排只会保证当前线程执行结果一致, 但指令重排后势必会影响多线程的执行结果。 虽
然重排序优化了性能, 但也是会遵守一些规则的, 并不能随便乱排序,只是重排序会影响多线程执行的结
果。
14. 什么是守护线程?有什么用?
什么是守护线程? 与守护线程相对应的就是用户线程, 守护线程就是守护用户线程, 当用户线程全部执行
完结束之后, 守护线程才会跟着结束。 也就是守护线程必须伴随着用户线程, 如果一个应用内只存在一个
守护线程,没有用户线程, 守护线程自然会退出。
15. 一个线程运行时发生异常会怎样?
如果异常没有被捕获该线程将会停止执行。 Thread.UncaughtExceptionHandler 是用于处理未捕获异常造
成线程突然中断情况的一个内嵌接口。 当一个未捕获异常将造成线程中断的时候JVM会使用
Thread.getUncaughtExceptionHandler()来查询线程的UncaughtExceptionHandler并将线程和异常作为参
数传递给handler的uncaughtException()方法进行处理。
16. 线程 yield()方法有什么用?
Yield 方法可以暂停当前正在执行的线程对象, 让其它有相同优先级的线程执行。它是一个静态方法而且只
保证当前线程放弃 CPU 占用而不能保证使其它线程一定能占用 CPU, 执行yield()的线程有可能在进入到暂
停状态后马上又被执行。
17. 什么是重入锁?
所谓重入锁, 指的是以线程为单位, 当一个线程获取对象锁之后, 这个线程可以再次获取本对象上的锁,
而其他的线程是不可以的。
18. 多线程之间如何进行通信?
多线程之间的通信可以通过多种方式实现,包括使用共享数据结构、使用锁、使用信号量、使用管道和队列
等。下面是一些常用的通信方式:
1. 共享数据结构:线程可以通过共享数据结构(如数组、列表或映射)进行通信。但是,这种方法需要谨
慎处理同步问题,以避免出现竞态条件和死锁。