在 java 中守护线程和本地线程区别?
任何的线程都可以设置为守护线程或者用户线程,通过thread.setDaemon就可以设置。这个设置必须要在thread.satrt之前设置,否则就会报错。
可以简单的理解为守护线程是jvm创建的(但这不绝对),用户线程是应用程序创建的。比如jvm的垃圾回收线程就是守护线程,当所有线程已经撤离,不再产生垃圾,守护线程自然就没事可干了,当垃圾回收线程是 Java 虚拟机上仅剩的线程时,Java 虚拟机会自动离开。。Thread Dump 打印出来的线程信息,含有 daemon 字样的线程即为守护进程,可能会有:服务守护进程,编译守护进程,GC守护进程等等
线程与进程的区别?协程
进程是资源分配的最小单位,线程是操作系统调度的最小单位
一个进程至少有 一个进程,同一进程内的线程之间的资源共享
协程(用户态):
-
因为函数(子程序)不是线程切换,而是由程序自身控制的,因此没有线程切换的开销;
-
和多线程比,线程数量越多,协程的性能优势越明显
什么是多线程中的上下文切换?
多线程共同使用计算机上的一组CPU,当线程数量大于CPU数量的时候,为了让所有的线程都有机会执行,需要轮转切换cpu,当不同线程使用CPU时发生的数据切换就叫做上下文切换
死锁与活锁的区别,死锁与饥饿的区别?
死锁:多个线程因为互斥的抢占一个资源而互相等待,如果没有借助外力就不会 放弃
死锁产生的必要条件:
互斥:某一资源在同一时间内只能被一个线占有
循环等待:形成了一种首尾相连的环
请求并保持:不会放弃资源等待
不被剥夺条件:已经占有资源的线程,在未使用完前不能被剥夺
活锁:任务或者事件由于没有成功,会失败,重试,而不是不是一直等待下去,活锁可以自行解开资源 等待,就是破坏了死锁的一些必要条件
饥饿: 线程由于一直无法满足执行条件,导致一直无法执行,造成了饥饿。处于一直无法执行的状态、
java中导致饥饿的原因:
一直被高优先级的线程抢占资源,自身无法获取资源
线程等待一个自身处于等待完成的对象(比如调用这个对象的wait方法)
解决办法:选取比较合适的线程调度算法
什么是线程组,为什么在 Java 中不推荐使用?
线程组是ThreadGroup类,它在里面既可以有线程对象,也会有线程组对象,有点类似于树状结构 ,不用是因为有安全问题
为什么使用 Executor 框架?
传统的new thread方式创建销毁线程的开销很大,而且随着new thread 被无限制创建,会导致由于系统资源被耗尽而瘫痪的问题。这些线程缺乏管理,线程之前的交互也会销号较多的资源。Excutor Service较new thread有更好的服务支持,对开发者很友好,比如定时定期执行,中断
在 Java 中 Executor 和 Executors 的区别?
Executors 工具类可以根据我们的需求创建线程池满足业务需求
Executor 接口方法可以执行线程任务
ExcutorService继承了Excutor接口并且丰富了功能,通过这个服务我们可以管理线程,获取线程的执行状态或者返回值
例如 ThreadPoolExutor可以创建自定义线程池
Feture 表示异步计算结果方法,它可以清楚计算执行的状态和结果的返回,通过get方法获取计算的结果,通过then来完成后续需要这个结果的操作,是一个相当不错的在平时业务开发中会用到的特性。
什么是原子操作?在 Java Concurrency API 中有哪些原子类(atomic classes)?
原子操作是java中一个不被中断,不受其他线程操作影响的任务单元,CAS原语就是Compare&Swap
在atomic包下提供了很多一些原子操作类对int或者long都提供了原子操作类
还有针对一些结合也提供了原子操作 类。当线程调用这些原子对象的方法的时候,这些操作是排他的,不会被打断,当其他线程就会像自旋锁一样,等待这个对象执行完成,并且加入任务队列中,当前方法执行完成后,jvm会从队列中取出一个任务继续执行
缺陷:
ABA问题的原子操作类:AtomicMarkbleReference(通过加入一个boolean值来判断中间是否发生过变化)
AtomicStampedReference(通过加入一个int类型变量来判断中间是否发生过变化)
cpu的空转
Java Concurrency API 中的 Lock 接口(Lock interface)是什么?对比同步它有什么优势?
Lock接口较synchronized提供了更多丰富的功能,同步只支持非公平锁
而lock支持公平锁,轮询锁(try lock),无条件锁,定时锁,可中断锁
什么是阻塞队列?阻塞队列的实现原理是什么?如何使用阻塞队列来实现生产者-消费者模型?
阻塞队列是一个支持两个附加操作的队列
支持当线程从队列里获取对象的时候,如果为空则