备战金九银十:2019最新高并发面试题大全(含详细答案解析)

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

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

2.如何停止线程运行?

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

3.普通线程与守护线程?

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

4.数据库死锁?

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

5.什么是锁顺序死锁?

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

6.死锁的避免与诊断?

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

7.线程饥饿与活锁?

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

8.多线程性能问题?

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

9.内存同步?

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

10.jvm同步优化?

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

11.降低锁的竞争?

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

12.java中常见的同步机制?

java主要同步机制是synchronized关键字, 还有显式的Lock,volatile,atomic,还有一些同步集合、阻塞队列等。

13.共享变量在多线程下如何保证线程安全?

因为多线程是交替执行,每个线程操作共享变量时可能会导致数据不一致,要确保线程安全,需要在访问共享变量时添加同步机制。当然,如果这个变量本身是线程安全的,比如AtomicLong,那么多线程访问也是安全的。

14.是否共享变量都使用类似AtomicLong原子安全类,多线程访问就是安全的?

这个不确定,因为无法保证多个变量同时操作,一个原子变量可以保证自己的安全性,但是同时操作多个有逻辑依赖原子的变量,仍可能带来线程安全问题。单个安全不代表组合也安全。

15.synchronized锁的使用?

synchronized同步代码块,修饰的方法是整个方法体,同步代码块的锁就是方法调用所在的对象实例;静态的synchronized方法以Class对象作为锁;还可以修饰具体对象,以具体对象为锁。

16.可重入锁,synchronized是可重入的吗?

17.volatile关键字的理解?

18.final修饰的不可变对象?

19.常见的并发容器?

20.常见的同步工具类?

21.线程'饥饿'死锁

22.ThreadPoolexecutor参数配置?

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

24.什么是Executor?

25.什么是线程池,如何创建线程池?

26.Executors可以创建哪些类型的线程池?

27.Executor的生命周期?

结束语

刷题最重要的是速度和效率。短时间内高质量快速刷完才是最终目的,明确自己的认知,不要和题目死磕。

坚持下来。如果一个事情方向是正确的时候,即使一时遇到挫折了,也不要气馁,多总结方法,持续提高。刷题这件事情给我的挫败感是非常高的,中间是一度放弃了很久,但是当我想明白这道坎是一定要过的时候,就下定了决心一定要攻克这道难关,持续总结方法,持续进步。

我个人认为,作为技术人就要保持终生学习的态度,让学习力成为核心竞争力,才能不被时代所淘汰,而高效的时间支配能让你变得更加优秀。
总结:想成为进阶架构师,那么资源肯定也是少不了的,如果你对技术提升很感兴趣,小编在这里提供了一份针对架构进阶视频资料,资源分享包括但不限于(分布式架构、高可扩展、高性能、高并 发、Jvm性能调优、Spring,MyBatis,Nginx源码分析,Redis,ActiveMQ、、Mycat、Netty、Kafka、Mysql 、Zookeeper、Tomcat、Docker、Dubbo、Nginx)。


欢迎工作一到五年的Java工程师朋友们加入Java高级互联网架构群:643459718  免费领取架构师资料

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
由于蓝桥杯省赛的试题不允许公开,因此我们无法提供完整的试题及答案解析。以下是部分题目及答案解析供参考: 1. 两个数的和 题目描述: 输入两个整数,求它们的和。 输入格式: 共一行,包两个整数。 输出格式: 共一行,包一个整数,表示两个整数的和。 Java代码: import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int a = in.nextInt(); int b = in.nextInt(); System.out.println(a + b); } } 2. 等差数列 题目描述: 输入一个整数n和一个整数d,输出1到n的等差数列,公差为d。 输入格式: 共一行,包两个整数n和d。 输出格式: 共n行,每行一个整数,表示等差数列中的一个数。 Java代码: import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int d = in.nextInt(); int x = 1; for (int i = 0; i < n; i++) { System.out.println(x); x += d; } } } 3. 最长上升子序列 题目描述: 给定一个长度为n的整数序列,求它的最长上升子序列的长度。 输入格式: 共一行,包n个整数,表示整数序列。 输出格式: 共一行,包一个整数,表示最长上升子序列的长度。 Java代码: import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int[] a = new int[n]; int[] f = new int[n]; for (int i = 0; i < n; i++) { a[i] = in.nextInt(); f[i] = 1; } int ans = 1; for (int i = 1; i < n; i++) { for (int j = 0; j < i; j++) { if (a[j] < a[i]) { f[i] = Math.max(f[i], f[j] + 1); } } ans = Math.max(ans, f[i]); } System.out.println(ans); } } 以上是部分题目及答案解析,仅供参考。建议考生在备战蓝桥杯省赛时,认真复习基础知识,多做题、多思考,提高解题能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值