Java面试题高级
2021-04-29 11:44:33   1  举报             
     
         
 AI智能生成
  Java面试题高级
    作者其他创作
 大纲/内容
  1.前提知识+要求  
     2.Java基础  
     3.JUC多线程及并发包    
     1.谈谈你对volatile的理解    
     1.volatile是Java虚拟机提供的轻量级的同步机制    
     1.1保证可见性  
     1.2不保证原子性  
     1.3禁止指令重排  
     2.JMM你谈谈    
     2.1可见性  
     2.2原子性    
     number++在多线程下是非线程安全的,如何不加synchronized解决?  
     2.3VolatileDemo代码演示可见性+原子性代码  
     2.4有序性    
     重排1  
     重排2    
     案例  
     禁止指令重排小总结(了解)  
     3.你在哪些地方用到过volatile?    
     3.1 单例模式DCL代码  
     3.2代理模式volatile分析  
     2.CAS你知道吗    
     1.比较并交换    
     CASDemo  
     2.CAS底层原理?如果知道,谈谈你对UnSafe的理解    
     atomicInteger.getAndIncrement();  
     UnSafe  
     CAS是什么    
     unSafe.getAndIncrement  
     底层汇编  
     简单版小总结  
     3.CAS缺点    
     循环时间长开销很大  
     只能保证一个共享变量的原子性  
     引出来ABA问题???  
     3.原子类AtomicInteger的ABA问题谈谈?原子更新引用知道吗    
     ABA问题的产生  
     原子引用    
     AtomicReferenceDemo  
     时间戳原子引用    
     AtomicStampedReference  
     ABADemo  
     4.我们知道ArrayList是线程不安全,请编写一个不安全的案例并给出解决方案    
     解决方案1    
     ContainerNotSafeDemo  
     限制不可以使用vector和Collections工具类解决方案2    
     List线程copyOnWriteArrayList  
     set线程CopyOnwriteHashSet  
     map线程ConcurrentHashMap  
     5.公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解?请手写一个自旋锁    
     公平锁和非公平锁    
     是什么  
     两者的区别  
     题外话  
     可重入锁(又名递归锁)    
     是什么  
     ReentrantLock/synchronized就是一个典型的可重入锁  
     可重入锁最大的作用就是避免死锁  
     ReenterLockDemo    
     参考1  
     参考2  
     自旋锁    
     SpinLockDemo  
     独占锁(写)/共享锁(读)/互斥锁    
     ReadWriteLockDemo  
     读写锁  
     6.CountDownLatch/CyclicBarrier/Semaphore使用过吗?    
     CountDownLatch    
     让一些线程阻塞直到另外一些完成后才被唤醒  
     CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,调用线程会被阻塞.其他线程调用countDown方法计数器减1(调用countDown方法时线程不会阻塞),当计数器的值变为0,因调用await方法被阻塞的线程会被唤醒,继续执行  
     CountDownLatchDemo    
     关门案例  
     枚举的使用  
     秦灭六国  
     CyclicBarrier    
     CyclicBarrier的字面意思是可循环(Cyclic) 使用的屏障(barrier).它要做的事情是,让一组线程到达一个屏障(也可以叫做同步点)时被阻塞,知道最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活,线程进入屏障通过CyclicBarrier的await()方法.  
     CyclicBarrierDemo    
     集齐7颗龙珠就能召唤神龙  
     代码  
     Semaphore    
     信号量的主要用户两个目的,一个是用于多喝共享资源的相互排斥使用,另一个用于并发资源数的控制.  
     SemaphoreDemo    
     抢车位  
     代码  
     7.阻塞队列知道吗?    
     队列+阻塞队列  
     为什么用?有什么好处?  
     BlockingQueue的核心方法  
     架构梳理+种类分析    
     架构介绍  
     种类分析    
     ArrayBlockingQueue: 由数组结构组成的有界阻塞队列.  
     LinkedBlockingDeque: 由链表结构组成的有界(但大小默认值Integer>MAX_VALUE)阻塞队列.  
     PriorityBlockingQueue:支持优先级排序的无界阻塞队列.  
     DelayQueue: 使用优先级队列实现的延迟无界阻塞队列.  
     SynchronousQueue:不存储元素的阻塞队列,也即是单个元素的队列.    
     理论  
     SynchronousQueueDemo  
     LinkedTransferQueue:由链表结构组成的无界阻塞队列.  
     LinkedBlockingDeque:由了解结构组成的双向阻塞队列.  
     用在哪里    
     生产者消费者模式    
     传统版    
     ProdConsumerTraditionDemo  
     阻塞队列版    
     ProdConsumerBlockQueueDemo  
     线程池  
     消息中间件  
     8.线程池用过吗?ThreadPoolExecutor谈谈你的理解?    
     为什么使用线程池,优势  
     线程池如何使用?    
     架构实现  
     编码实现    
     了解    
     Executors.newCachedThreadPool();  
     java8新出    
     Executors.newWorkStealingPool(int);    
     java8新增,使用目前机器上可以的处理器作为他的并行级别  
     重点    
     Executors.newFixedThreadPool(int)    
     执行一个长期的任务,性能好很多  
     Executors.newSingleThreadExecutor()    
     一个任务一个线程执行的任务场景  
     Executors.newCachedThreadPool()    
     适用:执行很多短期异步的小程序或者负载较轻的服务器  
     ThreadPoolExecutor  
     线程池几个重要参数介绍?    
     7大参数    
     1.corePoolSize:线程池中的常驻核心线程数  
     2.maximumPoolSize:线程池能够容纳同时执行的最大线程数,此值大于等于1  
     3.keepAliveTime:多余的空闲线程存活时间,当空间时间达到keepAliveTime值时,多余的线程会被销毁直到只剩下corePoolSize个线程为止  
     4.unit:keepAliveTime的单位  
     5.workQueue:任务队列,被提交但尚未被执行的任务.  
     6.threadFactory:表示生成线程池中工作线程的线程工厂,用户创建新线程,一般用默认即可  
     7.handler:拒绝策略,表示当线程队列满了并且工作线程大于等于线程池的最大显示 数(maxnumPoolSize)时如何来拒绝.  
     说说线程池的底层工作原理?  
     9.线程池用过吗?生产上你是如何设置合理参数    
     线程池的拒绝策略请你谈谈    
     是什么  
     JDK内置的拒绝策略    
     AbortPolicy(默认):直接抛出RejectedException异常阻止系统正常运行  
     CallerRunPolicy:"调用者运行"一种调节机制,该策略既不会抛弃任务,也不会抛出异常,而是  
     DiscardOldestPolicy:抛弃队列中等待最久的任务,然后把当前任务加入队列中尝试再次提交  
     DiscardPolicy:直接丢弃任务,不予任何处理也不抛出异常.如果允许任务丢失,这是最好的拒绝策略  
     以上内置策略均实现了RejectExecutionHandler接口  
     你在工作中单一的/固定数的/可变你的三种创建线程池的方法,你用哪个多?超级大坑    
     答案是一个都不用,我们生产上只能使用自定义的  
     Executors中JDK给你提供了为什么不用?  
     你在工作中是如何创建线程池的,是否自定义过线程池使用    
     Case  
     合理配置线程池你是如何考虑的?    
     CPU密集型  
     IO密集型    
     1  
     2  
     10.死锁编码及定位分析    
     是什么    
     产生死锁的主要原因    
     系统资源不足  
     进程运行推进的顺序不合适  
     资源分配不当  
     代码  
     解决    
     jps命令定位进程编号  
     jstack找到死锁查看  
     11.Java里面锁请谈谈你的理解,能说多少说多少  
     4.JVM+GC解析    
     前提复习    
     JVM内存结构    
     jVM体系概述  
     Java8以后的JVM  
     GC作用域  
     常见的垃圾回收算法    
     引用计数  
     复制  
     标记清除  
     标记整理  
     题目1  
     题目2  
     其他  
     5.消息中间件  
    
 
 
 
 
  0 条评论
 下一页