1、在 java 中守护线程和本地线程区别?
2、线程与进程的区别?
答:(1)线程是程序执行(资源调度)的基本单位;进程是资源分配的基本单位。
(2)同一个进程可以包含多个线程,并且每个线程可以共享进程的所有资源(堆与栈、寄存器、上下文),一个进程至少包含一个线程。
(3)进程的创建待用fork或vfork;而线程的创建调用pthread_create。进程结束后它的所有线程都销毁;而线程的结束不会影响同个进程中其他线程的结束。
(4)进程有自己独立的地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,代价高;线程共享进程中的数据,使用相同的地址空间,因此CPU切换一个线程的花费相对较低,创建一个线程的代价也相对较低。
(5)线程之间通信更方便,同一进程下的线程共享全局变量、静态变量等数据;而进程之间的通信需要以通信的方式(IPC)进行。
(6)多进程比线程更为健壮。一个进程死掉不会对其他进程造成影响;而多线程中只要有一个线程非正常死掉,整个进程就死掉。
附:
参考链接:https://www.jianshu.com/p/2dc01727be45
【1】堆: 是大家共有的空间,分全局堆和局部堆。全局堆就是所有没有分配的空间,局部堆就是用户分配的空间。堆在操作系统对进程初始化的时候分配,运行过程中也可以向系统要额外的堆,但是记得用完了要还给操作系统,要不然就是内存泄漏。
栈:是个线程独有的,保存其运行状态和局部自动变量的。栈在线程开始的时候初始化,每个线程的栈互相独立,因此,栈是 thread safe的。操作系统在切换线程的时候会自动的切换栈,就是切换 SS/ESP寄存器。栈空间不需要在高级语言里面显式的分配和释放。
【2】线程共享的环境包括:进程代码段、进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯)、进程打开的文件描述符、信号的处理器、进程的当前目录和进程用户ID与进程组ID。
【3】进程拥有这许多共性的同时,还拥有自己的个性。有了这些个性,线程才能实现并发性。这些个性包括:线程ID、寄存器组的值、线程的堆栈、错误返回码、线程的信号屏蔽码、线程的优先级
3、什么是多线程中的上下文切换?
4、死锁与活锁的区别,死锁与饥饿的区别?
5、Java 中用到的线程调度算法是什么?
6、什么是线程组,为什么在 Java 中不推荐使用?
7、为什么使用 Executor 框架?
8、在 Java 中 Executor 和 Executors 的区别?
9、如何在 Windows 和 Linux 上查找哪个线程使用的 CPU 时间最长?
10、什么是原子操作?在 Java Concurrency API 中有哪些原子类(atomic classes)?
11、Java Concurrency API 中的 Lock 接口(Lock interface)是什么?对比同步它有什么优势?
12、什么是 Executors 框架?
13、什么是阻塞队列?阻塞队列的实现原理是什么?如何使用阻塞队列来实现生产者-消费者模型?
14、什么是 Callable 和 Future?
15、什么是 FutureTask?使用 ExecutorService 启动任务。
16、什么是并发容器的实现?
17、多线程同步和互斥有几种实现方法,都是什么?
线程同步:
(1)同步方法:即有synchronized关键字修饰的方法。 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时,内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。
(2)同步代码块:即有synchronized关键字修饰的语句块。被该关键字修饰的语句块会自动被加上内置锁,从而实现同步。
(3)使用特殊域变量(volatile)实现线程同步
(4)使用重入锁实现线程同步
(5)使用局部变量实现线程同步
参考链接:https://www.cnblogs.com/xiaoxi/p/7679470.html
附:
(1)临界区(Critical Section):适合一个进程内的多线程访问公共区域或代码段时使用
(2)互斥量 (Mutex):适合不同进程内多线程访问公共区域或代码段时使用,与临界区相似。
(3)事件(Event):通过线程间触发事件实现同步互斥
(4)信号量(Semaphore):与临界区和互斥量不同,可以实现多个线程同时访问公共区域数据,原理与操作系统中PV操作类似,先设置一个访问公共区域的线程最大连接数,每有一个线程访问共享区资源数就减一,直到资源数小于等于零。
18、什么是竞争条件?你怎样发现和解决竞争?
19、你将如何使用 thread dump?你将如何分析 Thread dump?165
20、为什么我们调用 start()方法时会执行 run()方法,为什么我们不能直接调用 run()方法?