Java并发编程相关问题浅析(笔记四)部分含答案

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()方法?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值