java juc包面试题_【Java面试经验】JUC部分(对应周阳老师的面试教程)

写在最前:此篇文章对应周阳老师的大厂面试教程,几乎包含了大厂所有JUC部分的面试题,虽然自己无缘大厂,但是这些知识也让我在面试中得到了不错的评价。

MarkDown文档下载地址:JUC面试

个人博客地址:http://www.zwmuzhi.cn/

结合另一篇文章食用更为妥当【Java面试经验】JAVA基础部分(从入门到放弃)

JUC

java.util.concurrent的缩写

线程的6种状态

创建,可运行,阻塞,等待,计时等待,终结

Lambda表达式

java1.8之后允许接口中有部分方法的实现,需要用default关键字描述方法

@FunctionalInterface 注解表示函数式接口(仅有一个抽象方法)

常见异常总结

ConcurrentModificationException:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常

StackOverflowError:

多线程案例

ba4afdd4de83b8142767ab156256dc1e.png

新老技术方案

JDK1.5中将Lock接口代替synchronized升级为显示的锁机制

lock代替了synchronized关键字,Condition进行通信

Condition.await()代替了wait

Condition.signal()代替了notify signal信号

Synchronized

Synchronized关键字,同一时间只能有一个进程进入类中的Synchronized方法,相当于对象锁

0d1533c24f1b9d0f5279d85c83969aaf.png

static synchronized 锁的是类(.class),锁的是类的模板

ConcurrentModificationException异常

原因:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常

解决方案:

​ 1.可以使用Vector类,因为Vector中的add方法带有synchronized关键字

​ 2.Collections.synchronizedList 使用Collections工具栏把List变为线程安全

​ 3.使用JUC中的CopyOnWriteArrayList类,采用了写时复制的思想(读写分离),使用lock锁

1ef9f96910c022f1cfdcbad71b89fa37.png

99614ad21b7b822567346547636d0b72.png

HashSet

hashset底层是hashmap,hashset的构造方法其实就是new了一个hashmap,在执行add方法时,调用的是map的put方法,key为加入的值,value是一个默认值(PRERSEND常量)

public boolean add(E e) {

return map.put(e, PRESENT)==null;

}

public HashSet() {

map = new HashMap<>();

}

ArryList扩容为原来的一半,HashMap为原来的一倍

获取多线程的方式

1.继承Thread类

2.实现Runnble接口

3.实现Callable接口

Callable接口和Runnble接口的区别

1.Callable有返回值

2.Callable会有异常

3.Callable执行的是call方法,Runnble是run方法

Callable接口的get方法一般放在最后一行

CountDownLatch

countDownLatch这个类使一个线程等待其他线程各自执行完毕后再执行。

是通过一个计数器来实现的,计数器的初始值是线程的数量。每当一个线程执行完毕后,计数器的值就-1,当计数器的值为0时,表示所有线程都执行完毕,然后在闭锁上等待的线程就可以恢复工作了

CyclicBarrier

一个同步帮助,允许一组线程相互等待,以达到一个共同的障碍点。cyclicbarriers涉及一个固定大小的线程必须党偶尔互相等待程序是有用的。该障碍被称为循环,因为它可以在等待线程被释放后重新使用。

CountDownLatch做减法,CyclicBarrier做加法

Semaphore

222972e28cf1379c6187a9229576f3f6.png

ReadWriteLock

读写锁

BlockingQueue

997607718374f387989bfd708ade7ed1.png

37b80c427d1d75c69312f10520a26ace.png

66d0713a4add3a9047a8f012e08216d6.png

a6cd6f37999ee880b89a539f0b5bf453.png

线程池

线程池的优势

线程池的工作主要是控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,超出数量的线程排队等候,等待其他线程执行完毕,再从队列中取出任务来执行。

主要特点

线程复用

控制最大并发量

管理线程

ThreadPoolExecutor

cbddbaa96ad02e39def081822baa3755.png

ThreadPoolExecutor是线程池的主要操作类,上图的三个分别为指定线程数,单一线程,自动扩容线程

他们底层都是调用了ThreadPoolExecutor类的构造方法来实现

a17595ec30c0624eadbffe9fe6c785f4.png

七大参数

97440fa4b2f0888951dbae13558d83c5.png

工作原理

870f1e213de80be79e9401c5cf6835e0.png

5713defce14f93aadab99a4217465244.png

b5ef90473fbc41616e252609445aafb7.png

一般使用哪种线程池

ddc2b197e50f158ee54cb574e6853529.png

四大拒绝策略

6fb4a04eca34b26fa005e5579cfb26c3.png

AbortPolicy

超过线程数会抛出异常 abort:中止计划

965db6e9d10d3b9d0a1e86a02ffb082a.png

CallerRunsPolicy

会将任务退回到执行人处

5417d6012822e1abb5f165a6e44a2205.png

DiscardOldestPolicy

抛弃等待最久的 Discard:抛弃

DiscardPolicy

不处理

函数式接口

8cc819de8b88748ca0fb245314294296.png

Stream流

c510cccba8973a56cbc210c7684440b6.png

特点

ca29ea11218ba5a1c39a7eef122f8441.png

ForkJoin

分支合并框架

class MyTask extends RecursiveTask{

private static final Integer ADJUST_VALUE = 10;

private int begin;

private int end;

private int result;

public MyTask(int begin, int end) {

this.begin = begin;

this.end = end;

}

@Override

protected Integer compute() {

if ((end-begin)<=ADJUST_VALUE){

for (int i = begin; i <=end ; i++) {

result = result+i;

}

}else {

int middle = (end+begin)/2;

MyTask task1 = new MyTask(begin,middle);

MyTask task2 = new MyTask(middle+1,end);

task1.fork();

task2.fork();

result = task1.join()+task2.join();

}

return result;

}

}

public class ForkJoinDemo {

public static void main(String[] args) throws ExecutionException, InterruptedException {

MyTask myTask = new MyTask(0,2000);

ForkJoinPool threadPool = new ForkJoinPool();

ForkJoinTask forkJoinTask = threadPool.submit(myTask);

System.out.println(forkJoinTask.get());

threadPool.shutdown();

}

}

JVM

JVM体系结构

d3ece0f07f0edbc1da6e8c7d394eb8bb.png

灰色的是线程私有的,黄色的是共享的(存在垃圾回收)

类加载器ClassLoader

cecf926cbb07365007bf404369051781.png

5e5e084fbced01bf079e2a8448ce76af.png

JAVA自带的使用Bootstrap加载器

自己编写的类使用AppClassLoader加载器

双亲委派机制

我爸是李刚,有事找我爹

bd0fcebee53f6172b9424d27a4afa6f8.png

沙箱安全

防止自己写的代码污染JDK中的包

Native

87a8caa841e97c47038fb321d01728c2.png

54ea46683e0887c9df00eefc9652b0c3.png

native是一个关键字

含有native关键字的方法只有声明,没有实现,因为他是调用的C语言

PC寄存器

e6ae5ac22ca1151ee9ba973e77ac0e1f.png

记录了方法之间的调用和执行情况,用来存储指向下一条指令的地址,也就是即将要执行的指令代码,他是当前线程所执行的字节码的行号显示器

方法区

c6ae523f1812a4bbce7289c153732c5b.png

236a6186ad9c4ba5d6c08bf8c90e180d.png

栈管运行,堆管存储

e9e3e4d25fb08bf2c8bbbace2343b629.png

8种基础类型,实例方法,对象的引用变量存在栈中

d04b7317ff181f639bd375764d1e1f2b.png

15f07f4b9c113310f612adadf6cdc58d.png

堆 栈 方法区的交互关系

47803effa989905949aea71c53631e33.png

堆 heap

59756cab1064161e6af3d99961b6be99.png

7f83dcbb7721c73ca44b2d13b90a72e0.png

d1f49c7f5603b457c0a68e647b4bead0.png

933031a2c1009bd50caf2b380d6b0767.png

476bd452218959bbe3b9c3f84fb6f172.png

724ab463a3df910111328b707c612a9d.png

堆参数调优

c27f84d9690bf90b2e2bd5bab54057b5.png

JDL1.7演示

b60a8cbf1cc81b6cc0de71896b474c35.png

JDK1.8演示

17d37b0d7e79d6ae3921cb8d3d170598.png

GC是什么

d28bff485af8d785b67bff9533830d1b.png

Minor GC和Full GC的区别

a821b7a2ea3f2b8f79a006a8cd4b3e39.png

4大算法

b6646de8c5e12f55ddb467d2f23fee52.png

1.引用计数法

6e4110fa23d524a0d06515af15c85368.png

2.复制算法

2ec786c28b594b664e0d71315e02adf3.png

c8b4c7fdd30cd5c96efd5441a14c966d.png

044e357e13e42a5c388df3fbe6c70b2c.png

3.标记清楚

975ae375a755d2bbc243448b04cff77d.png

18bff8fde31bdf40b00ff1968c68d65f.png

cedf8e712446c2a53f41fb3db531d471.png

4.标记压缩

bae3deb7ac160a66d118e0f9d69b9052.png

总结

ff8155db4eb85fcb85f1574db3bbd2a4.png

aea625caffc7f8fa4756216e9879ad02.png

面试题

c0930ee221e3c0fb49186bb595691941.png

JMM

9027849087ed23788667a419172dd63a.png

3.标记清楚

d956315b239df030d97a97f72e614953.png

089c7f75846e528d0b9b8a08f16ce009.png

4824a6c4ad135f1a6bf87c3e6ddb3519.png

4.标记压缩

1d545d7efcdab8148b3cc3e75db79325.png

总结

d2dee7514760d4f446256513a68d3d88.png

2b8e9e36631e0f5949e7757c5a4afca3.png

面试题

8eb751eb207cbd1fb2a85a0711d155ed.png

JMM

f315f1dd1add5c114d1c3d90f483600b.png

ba2f6fa85c42f06a9b278871d9f33c2e.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值