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

   日期:2020-07-07     浏览:740    评论:0    
核心提示:写在最前:此篇文章对应周阳老师的大厂面试教程,几乎包含了大厂所有JUC部分的面试题,虽然自己无缘大厂,但是这些知识也让我在面试中得到了不错的评价。需要找工作的同学可以搭配另一篇文章来使用JUCjava.util.concurrent的缩写线程的6种状态创建,可运行,阻塞,等待,计时等待,终结Lambda表达式java1.8之后允许接口中有部分方法的实现,需要用default关键字描述方法@FunctionalInterface 注解表示函数式接口(仅有一个抽象方法)常见异常总结Concur

写在最前:此篇文章对应周阳老师的大厂面试教程,几乎包含了大厂所有JUC部分的面试题,虽然自己无缘大厂,但是这些知识也让我在面试中得到了不错的评价。
MarkDown文档下载地址:JUC面试
个人博客地址:http://www.zwmuzhi.cn/

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

JUC

java.util.concurrent的缩写

线程的6种状态

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

Lambda表达式

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

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

常见异常总结

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

StackOverflowError:

多线程案例

新老技术方案

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

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

Condition.await()代替了wait

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

Synchronized

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

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

ConcurrentModificationException异常

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

解决方案:

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

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

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

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

ReadWriteLock

读写锁

BlockingQueue

线程池

线程池的优势

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

主要特点

  • 线程复用
  • 控制最大并发量
  • 管理线程

ThreadPoolExecutor

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

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

七大参数

工作原理


一般使用哪种线程池

四大拒绝策略

AbortPolicy

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

CallerRunsPolicy

会将任务退回到执行人处

DiscardOldestPolicy

抛弃等待最久的 Discard:抛弃

DiscardPolicy

不处理

函数式接口

Stream流

特点

ForkJoin

分支合并框架

class MyTask extends RecursiveTask<Integer>{

    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<Integer> forkJoinTask = threadPool.submit(myTask);
        System.out.println(forkJoinTask.get());
        threadPool.shutdown();
    }
}

JVM

JVM体系结构

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

类加载器ClassLoader

JAVA自带的使用Bootstrap加载器

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

双亲委派机制

我爸是李刚,有事找我爹

沙箱安全

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

Native

native是一个关键字

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

PC寄存器

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

方法区

  • 栈管运行,堆管存储

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

堆 栈 方法区的交互关系

堆 heap

堆参数调优

JDL1.7演示

JDK1.8演示

GC是什么

Minor GC和Full GC的区别

4大算法

1.引用计数法

2.复制算法

3.标记清楚

4.标记压缩

总结

面试题

JMM

3.标记清楚

4.标记压缩

总结

面试题

JMM

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服