• pa_ft面试记录


    1、说一下你对springboot的了解,你们在项目中是如何用springboot集成mybatis的?

      2)在pom.xml中加入对Mybatis的依赖

        在SpringBoot启动类中加入MapperSan注解来指定扫描Mapper的位置

        在application.yml或application.properties中加入对Mybatis的配置

    2、讲一下你在项目中主要做了哪些模块?下载任务模块是这么做的?多个模块的下载任务,怎么保证数据的一致性、

      通过数据库的锁来保证一致性

    3、了解过jvm有哪些异常么?怎么解决outofmemoryexception/StackOverflowError?你一般用什么工具来分析jvm运行情况呢?

      工具:JConsole/JProfile

    4、怎么解决kafka消息的重复消费呢?怎么保证消息队列的一致性呢?

    5、mybatis的#和$有什么区别?

    6、你知道哪些常用的Linux命令?

    7、你知道哪些数据库调优手段?哪些情况下会使索引失效呢?

    8、线程有哪些实现方式?用线程池有什么好处?创建线程池的几种方式?线程池的核心参数有哪些?

      2)  降低资源消耗

        提高响应速度

        提高线程的可管理性。使用线程池可以进行资源的统一分配、调优和监控。

      3)Java通过Executors提供四种线程池,分别为:
        newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
        newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
        newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
        newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

        底层都是调用ThreadPoolExecutor

      4)核心参数:核心线程数、最大线程数、空闲线程超时休眠时间、休眠时间单位、阻塞队列、线程拒绝策略

      参考:https://www.cnblogs.com/owenma/p/8557074.html

    9、如何保证线程安全?你知道哪些锁?了解分布式锁么?

      通过对多个线程的同一数据进行同步来实现线程安全

      1)互斥同步锁(悲观锁)

      Synchorized:前者是由语言级别实现的互斥同步锁,理解和写法简单但是机制笨拙,在JDK6之后性能优化大幅提升,即使在竞争激烈的情况下也能保持一个和ReentrantLock相差不多的性能,所以JDK6之后的程序选择不应该再因为性能问题而放弃synchorized。

      ReentrantLock:ReentrantLock是API层面的互斥同步锁,需要程序自己打开并在finally中关闭锁,和synchorized相比更加的灵活,体现在三个方面:等待可中断,公平锁以及绑定多个条件。但是如果程序猿对ReentrantLock理解不够深刻,或者忘记释放lock,那么不仅不会提升性能反而会带来额外的问题。

      另外synchorized是JVM实现的,可以通过监控工具来监控锁的状态,遇到异常JVM会自动释放掉锁。而ReentrantLock必须由程序主动的释放锁。所以一定要记得释放锁,一般最好写在final块中,确保锁能正确释放。

      互斥同步锁都是可重入锁,好处是可以保证不会死锁。但是因为涉及到核心态和用户态的切换,因此比较消耗性能。JVM开发团队在JDK5-JDK6升级过程中采用了很多锁优化机制来优化同步无竞争情况下锁的性能。比如:自旋锁和适应性自旋锁,轻量级锁,偏向锁,锁粗化和锁消除。

      2)非阻塞同步锁(乐观锁)

      主要原子类

      它会先进行资源在工作内存中的更新,然后根据与主存中旧值的对比来确定在此期间是否有其他线程对共享资源进行了更新,如果旧值与期望值相同,就认为没有更新,可以把新值写回内存,否则就一直重试直到成功。它的实现方式依赖于处理器的机器指令:CAS(Compare And Swap)

      JUC中提供了几个Automic类以及每个类上的原子操作就是乐观锁机制。

      不激烈情况下,性能比synchronized略逊,而激烈的时候,也能维持常态。激烈的时候,Atomic的性能会优于ReentrantLock一倍左右。但是其有一个缺点,就是只能同步一个值,一段代码中只能出现一个Atomic的变量,多于一个同步无效。因为他不能在多个Atomic之间同步。 

      非阻塞锁是不可重入的,否则会造成死锁。

      AtomicInteger中的volatile关键字:

      a)可以在多个线程间共享变量,变量在一个线程中更新时其他线程都会知道

      b)禁止JVM的指令重排序

      缺点:由于禁止了指令重排序,导致JVM的优化失效,因此在不必要的时候不要使用volatile和原子类

  • 相关阅读:
    Kubernetes对象之Pod
    docker&k8s填坑记
    kubernetes安装过程中遇到问题及解决
    深入JVM-垃圾回收概念与算法
    深入JVM-常用Java虚拟机参数
    深入JVM-java虚拟机的基本结构
    从Paxos到ZooKeeper-三、ZooKeeper的典型应用场景
    从Paxos到ZooKeeper-二、ZooKeeper和Paxos
    从Paxos到ZooKeeper-一、分布式架构
    java编程思想-java中的并发(四)
  • 原文地址:https://www.cnblogs.com/codewy/p/11559011.html
Copyright © 2020-2023  润新知