java 面试题摘要
5.1 什么是线程
线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程的实际运作单位,
可以使用多线程对运算提速。
5.2 线程和进程有什么区别
(1)进程是资源的分配和调度的一个独立单元,而线程是CPU调度的基本单位
(2)同一个进程中可以包括多个线程,并且线程共享整个进程的资源,一个进程至少包括一个线程
(3)进程的创建需要fork或者vfork,而线程的创建用ptheread create,进程结束后它拥有的所有线程都将销毁,而线程的结束不会影响同一个进程中其他线程的结束
(4)线程是轻两级的进程,它的创建和销毁所需要的时间比进程小很多,所有操作系统中的执行功能都是创建线程去完成的
(5)线程中执行时一般都要进行同步和互斥,因为他们共享同一进程的所有资源。
5.3 如何在 Java 中使用新线程
java.lang.Thread 类的实例就是一个线程但是它需要调用java.lang.Runnable接口来执行,
由于线程类本身就是调用的Runnable接口所以你可以继承 java.lang.Thread 类或者直接调用Runnable接口来重写run()方法实现线程。
5.4 start() 和 run() 有什么区别
(1)run 只是运行这个方法,并不会开启一个新的线程
(2)start是开启一个新线程,并且运行run方法
5.5 Thread.join 方法有什么用
Thread.join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。
比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。
5.6 假如新建T1、T2、T3三个线程,如何保证它们按顺序执行?
(1)使用 Thread.join 方法
(2)使用 synchronized 关键字
(3)使用 ReenreantLock类
ReentrantLock() : 创建一个ReentrantLock实例
lock() : 获得锁
unlock() : 释放锁
5.7 volatile 变量是做什么的
volatile是Java提供的一种轻量级的同步机制,在并发编程中,它也扮演着比较重要的角色。同synchronized相比(synchronized通常称为重量级锁),volatile更轻量级
5.8 如果一个线程中发生了异常会怎么样
① 如果该异常被捕获或抛出,则程序继续运行。
② 如果异常没有被捕获该线程将会停止执行
5.9 什么是 ThreadLocal 变量
ThreadLocal变量就是和线程绑定的变量.实际上是一个Map,,,key是对应的线程,值则是该变量. 调用ThreadLocal的get方法时则会到Map中查询当前线程是否已拥有该变量,如果没有则新建一个并保存到Map中.有的话直接返回与该线程绑定的变量.
5.10 什么是线程池,为什么要使用
(1)线程池是指在初始化一个多线程应用程序过程中创建一个线程集合,线程池主要用来解决线程生命周期开销问题和资源不足问题
(2)为什么要使用:
(1)提高重用性
(2)减少开支
(3)控制线程池的并发数
(4)便于管理线程
5.11 Thread.sleep 和 wait 方法有什么不同
(1)sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep 不会释放对象锁。
(2)wait 是Object 类的方法,对此对象调用wait 方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify 方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
(3)sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常。
(4)sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
5.12 synchronized 关键词是做什么的
(1)这个关键字用于修饰方法。它的原理是:被sychronized关键词修饰的方法,在调用对象的时候,会独占该对象,在方法执行结束之前,不允许其它方法使用该对象。
5.12 volatile 关键字
当一个共享变量被volatile修饰时,它会保证修改的值立即被更新到主存“。
volatile特性
内存可见性:通俗来说就是,线程A对一个volatile变量的修改,对于其它线程来说是可见的,即线程每次获取volatile变量的值都是最新的。
volatile的使用场景
通过关键字sychronize可以防止多个线程进入同一段代码,在某些特定场景中,volatile相当于一个轻量级的sychronize,因为不会引起线程的上下文切换,但是使用volatile必须满足两个条件:
1、对变量的写操作不依赖当前值,如多线程下执行a++,是无法通过volatile保证结果准确性的;
2、该变量没有包含在具有其它变量的不变式中。