博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面试高并发,看这篇就够了(下)
阅读量:5095 次
发布时间:2019-06-13

本文共 2377 字,大约阅读时间需要 7 分钟。

1 Thread的start方法和run方法的区别?

run方法就是普通的一个方法,代码运行在当前主线程,start会启动一个新的线程,并运行run方法。

2 如何停止线程运行?

可以设置一个标志位,任务定期检查这个标记,如果标志设置为取消则任务停止执行,但已执行部分无法停止,标志变量最好设置为volatile。

3 普通线程与守护线程?

本质都是线程没什么区别,守护线程在主线程结束时将被抛弃,自动退出。比如垃圾回收线程。

4 线程'饥饿'死锁

在线程池中,如果一个任务依赖其他任务,那么可能会导致线程死锁。比如在单线程的Executor中,一个任务将另一个任务提交到Executor中,等待这个任务的处理结果。第一个任务在等待第二个任务,而第二个任务在队列里等待第一个任务执行完成。

5 ThreadPoolexecutor参数配置?

corePoolSize - 池中所保存的线程数,包括空闲线程。

maximumPoolSize - 池中允许的最大线程数。

keepAliveTime - 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间。

unit - keepAliveTime 参数的时间单位。

workQueue - 执行前用于保持任务的队列。此队列仅保持由 execute 方法提交的 Runnable 任务。

threadFactory - 执行程序创建新线程时使用的工厂。

handler - 由于超出线程范围和队列容量而使执行被阻塞时所使用的处理程序。 

如果池中运行的线程小于coreSize,那么新的请求将创建新的线程,如果coreSize线程全部忙碌,新请求将被添加到队列,如果队列已满,那么将继续创建新线程,但线程总数<=maximumPoolSize,多余coreSize的线程会在超过keepAliveTime终止。

6 线程池任务饱和时处理策略?

当线程池线程数已经达到最大值,注意这时队列一定已经满了,线程池已经处于饱和状态,那么新来的请求将会按照相对应的策略被处理。

AbortPolicy:拒绝任务,抛出RejectedExecutionException

CallerRunsPolicy:在 execute 方法的调用线程中运行被拒绝的任务;如果执行程序已关闭,则会丢弃该任务。

DiscardPolicy:直接丢弃。

7 哲学家就餐问题?

5个哲学家一起吃午餐,围坐在一个圆桌前,每两个哲学家中间有一根筷子,一共有5根筷子,每个人都需要有一双筷子才能吃到东西,哲学家们思儿思考时而进餐。当每个人都第一时间拿起左手边的筷子,同时等待右手边的哲学家释放筷子的时候,就陷入了死锁。

8 数据库死锁?

在执行一个事务时可能要获取多个锁,一直持有锁到事务提交,如果A事务需要获取的锁在另一个事务B中,且B事务也在等待A事务所持有的锁,那么两个事务之间就会发生死锁。但数据库死锁比较少见,数据库会加以干涉死锁问题,牺牲一个事务使得其他事务正常执行。

9 什么是锁顺序死锁?

两个线程试图以不同的顺序获得相同的锁,那么可能发发生死锁。比如转账问题,由from账户向to账户转账,假设每次我们先同步from对象,再同步to账户,然后执行转账操作,貌似没什么问题。如果这时候to账户同时向from账户转账,那么两个线程可能要永久等待。

 

10 死锁的避免与诊断?

如果一个线程最多只能获取一个锁,那么就不会发生锁顺序死锁了。如果确实需要获取多个锁,锁的顺序可以按照某种规约,比如两个资源的id值,程序按规约保证获取锁的顺序一致。或者可以使用显式的锁Lock,获取锁的时候设置超时时间,超时后可以重新发起,以避免发生死锁。

11 线程饥饿与活锁?

当线程由于无法访问需要的资源而不能继续执行时,就是饥饿状态。活锁是线程虽然没有阻塞,但也不能继续执行,因为程序总是执行相同的操作,且结果都是失败。

12 多线程性能问题?

使用多线程主要就是为了提高程序的运行性能,多线程可以更充分发挥系统可处理能力,从而提高系统资源利用率。但多线程自身同时带来了性能开销,线程的创建与销毁,线程间的协调(比如加锁、内存同步),线程调度,上下文的切换等。好的并发设计就是充分利用现有资源,尽可能使处理器忙碌起来,当然程序设计始终不能脱离业务场景。

13 内存同步?

在synchronized和volatile提供的可见性保证中可能会用到内存屏障,内存屏障可以刷新缓存,使缓存无效。同时内存屏障会抑制一些编译器优化操作,大多数操作不能被重排序。

14 jvm同步优化?

jvm可以通过优化去掉一些不必要的锁,从而减少同步开销。比如一个对象只能被当前线程访问,其他线程不会与当前线程在这个锁上发生同步,jvm可以锁优化去掉同步操作。编译器也可以进行锁粒度粗化操作,将临近的多个同步代码用一个锁合并起来,不仅可以减少多个同步带来的不必要的开销,同时还能使优化器处理更大的代码块,带来进一步的优化。锁自旋,当线程发生阻塞时,可能会自旋等待(不断循环尝试去获取锁),或者通过操作系统挂起线程,当然这要看锁等待时间,来决定是否自旋。

15 降低锁的竞争?

减少锁的持有时间,减少锁的请求频率,使用带有协调机制的独占锁。具体实现可以缩小锁的范围,快进快出。比如只锁同步操作代码块,不要把相关非同步业务逻辑也包含到同步代码块中。可以减小锁的粒度,能对目标对象进行上锁,就不要对操作目标对象的方法上锁,也可以使用一些锁分段技术的组件,比如ConcurrentHashMap。也可以使用一些非独占锁,比如ReadWriteLock。

转载于:https://www.cnblogs.com/render-inside/p/10543796.html

你可能感兴趣的文章
QT5.3 杂记(转)
查看>>
如何跟开发就测试范围进行沟通?
查看>>
js模板引擎-art-template常用总结
查看>>
jQuery中的模拟操作
查看>>
红黑树的删除压力测试和完整性检查
查看>>
Ajax 分页
查看>>
关于GreenOdoo的一个Bug
查看>>
有网络信号,但输入密码却无法连接的解决方法
查看>>
自己写的DBHelper感慨颇深
查看>>
DeferredResult使用方式和场景
查看>>
WIN XP 添加删除WINDOWS组件时,指定的系统光盘路径
查看>>
email 正则
查看>>
GIS简单计算Helper类
查看>>
PHP 把返回的数据集转换成Tree树
查看>>
布隆过滤器
查看>>
Spring 3.x MVC 入门2 -- 通过示例初步感受spring mvc
查看>>
Unique Paths 解答
查看>>
密码技术发展几十年 我们真的安全了吗?
查看>>
workerman需要的php模块posix、pcntl、sysvshm、sysvmsg缺少,怎么办
查看>>
AtCoder Beginner Contest 075 D - Axis-Parallel Rectangle
查看>>