精华内容
下载资源
问答
  • Java中高级面试题

    千次阅读 2021-03-06 21:21:13
    10)数组在内存如何分配; 11)用过哪些设计模式,手写一个(除单例); 12)springmvc的核心是什么,请求的流程是怎么处理的,控制反转怎么实现的; 13)spring里面的aop的原理是什么; 14)mybatis如何处理结果...

    一.基础知识:

    1)集合类:List和Set比较,各自的子类比较(ArrayList,Vector,LinkedList;HashSet,TreeSet);

    2)HashMap的底层实现,之后会问ConcurrentHashMap的底层实现;

    3)如何实现HashMap顺序存储:可以参考LinkedHashMap的底层实现;

    4)HashTable和ConcurrentHashMap的区别;

    5)String,StringBuffer和StringBuilder的区别;

    6)Object的方法有哪些:比如有wait方法,为什么会有;

    7)wait和sleep的区别,必须理解;

    8)JVM的内存结构,JVM的算法;

    9)强引用,软引用和弱引用的区别;

    10)数组在内存中如何分配;

    11)用过哪些设计模式,手写一个(除单例);

    12)springmvc的核心是什么,请求的流程是怎么处理的,控制反转怎么实现的;

    13)spring里面的aop的原理是什么;

    14)mybatis如何处理结果集:反射,建议看看源码;

    15)java的多态表现在哪里;

    16)接口有什么用;

    17)说说http,https协议;

    18)tcp/ip协议簇;

    19)osi五层网络协议;

    20)tcp,udp区别;

    21)用过哪些加密算法:对称加密,非对称加密算法;

    22)说说tcp三次握手,四次挥手;

    23)cookie和session的区别,分布式环境怎么保存用户状态;

    24)git,svn区别;

    25)请写一段栈溢出、堆溢出的代码;

    26)ThreadLocal可以用来共享数据吗;

    f4cffc1300b2b86fa4d5b2ba81e950e9.png

    二.IO:

    1)bio,nio,aio的区别;

    2)nio框架:dubbo的实现原理;

    3)京东内部的jsf是使用的什么协议通讯:可参见dubbo的协议;

    三.算法:

    1)java中常说的堆和栈,分别是什么数据结构;另外,为什么要分为堆和栈来存储数据。

    2)TreeMap如何插入数据:二叉树的左旋,右旋,双旋;

    3)一个排序之后的数组,插入数据,可以使用什么方法?答:二分法;问:时间复杂度是多少?

    4)平衡二叉树的时间复杂度;

    5)Hash算法和二叉树算法分别什么时候用;

    6)图的广度优先算法和深度优先算法:详见jvm中垃圾回收实现;

    fe5dd97fc752d67964c0311359131352.png

    三.多线程相关:

    1)说说阻塞队列的实现:可以参考ArrayBlockingQueue的底层实现(锁和同步都行);

    2)进程通讯的方式:消息队列,共享内存,信号量,socket通讯等;

    3)用过并发包的哪些类;

    4)什么地方用了多线程;

    5)Excutors可以产生哪些线程池;

    6)为什么要用线程池;

    7)volatile关键字的用法:使多线程中的变量可见;

    四.数据库相关(mysql):

    1)msyql优化经验:

    2)mysql的语句优化,使用什么工具;

    3)mysql的索引分类:B+,hash;什么情况用什么索引;

    4)mysql的存储引擎有哪些,区别是什么;

    5)说说事务的特性和隔离级别;

    6)悲观锁和乐观锁的区别,怎么实现;

    6c668db8e31ef406f605246a7bfc6140.png

    五.mq:

    1)mq的原理是什么:有点大。。都可以说;

    2)mq如何保证实时性;

    3)mq的持久化是怎么做的;

    六.nosql相关(主要是redis):

    1)redis和memcache的区别;

    2)用redis做过什么;

    3)redis是如何持久化的:rdb和aof;

    4)redis集群如何同步;

    5)redis的数据添加过程是怎样的:哈希槽;

    6)redis的淘汰策略有哪些;

    7)redis有哪些数据结构;

    七.zookeeper:

    1)zookeeper是什么;

    2)zookeeper哪里用到;

    3)zookeeper的选主过程;

    4)zookeeper集群之间如何通讯;

    5)你们的zookeeper的节点加密是用的什么方式;

    6)分布式锁的实现过程;

    13a975d26d979ca101893100db79b81e.png

    八.linux相关:

    1)linux常用的命令有哪些;

    2)如何获取java进程的pid;

    3)如何获取某个进程的网络端口号;

    4)如何实时打印日志;

    5)如何统计某个字符串行数;

    九.设计与思想:

    1)重构过代码没有?说说经验;

    2)一千万的用户实时排名如何实现;

    3)五万人并发抢票怎么实现;

    展开全文
  • (精选97道Java核心面试题) 常量池有哪些,数据结构,自己设计一个常量池 String为啥设计为final,好处是啥,其中的equals方法如何实现的 jdk序列化怎么实现,有测试过他的性能吗,serialVersionUID的作用是什么,...

    这些面试题你都会了吗?(精选97道Java核心面试题)

    • 常量池有哪些,数据结构,自己设计一个常量池
    • String为啥设计为final,好处是啥,其中的equals方法如何实现的
    • jdk序列化怎么实现,有测试过他的性能吗,serialVersionUID的作用是什么,用过一些其他序列化方式没,为什么需要序列化这个技术
    • hashmap1.7 和 1.8的区别 hashmap怎么解决hash冲突的 查询时间复杂度 数据结构
    • hashmap的加载因子为什么是0.75 好处有没有去思考过 还有为什么初始化容量是16 为什么就不是15 put的死循环
    • LinkedHashMap和hashmap的区别 数据结构 怎么实现LRU
    • TreeMap的底层排序算法用的什么 说下快排和堆排
    • ConcurrentHashMap1.7 1.8的区别 size方法可以保证一致性吗 知道缓存行吗,里面用到的缓存行填充技术是为了解决什么 put方法和hashmap的put的区别有哪些
    • jdk的@Contented原理说一下
    • jvm和jmm区别说一下 说一下jvm内存模型
    • oom了解不,说一下可能发生oom的内存区域,堆外内存可以发生oom不,会不会被垃圾回收 堆外内存一般在什么地方会用到
    • 回收算法 分别优缺点
    • CMS和G1的区别 分别说一下数据结构
    • CMS和G1分别的使用场景 G1最后一步操作是什么 为什么用户可以自己设置回收内存 jdk这样设计的好处是什么
    • 说一下项目中调优经验
    • 说一下MAT的最长引用链功能 MAT一般用来分析什么比较快
    • 一般你怎么分析一个OOM
    • gc日志里面可以看到垃圾回收器吗
    • 看内存使用情况用什么命令
    • 看程序里面有多少个线程在运行怎么看
    • 线程的状态怎么分析 如果BLOCKING和WAITING状态的线程很多 会出现什么情况 说一下BLOCKING和WAITING的区别
    • 如何排查CPU过高的情况
    • 深堆和浅堆
    • jinfo的作用是什么
    • STW是什么意思 CMS和G1分别在哪些时期发生的STW 有没有可能避免STW的情况
    • 并行和并发的区别
    • 说一下sync锁和lock锁的区别 他们都是为了保证什么 除了这两种方式还可以怎么优雅的保证程序运行正常
    • sync锁的底层原理
    • 为什么轻量级锁就比重量级锁要快
    • 程运行到一半,cpu切换到另一个线程,之后再切换回来执行,是怎么保证在上一次执行点执行的
    • sync锁的锁升级和lock锁的锁降级的区别
    • lock锁的锁降级的优化点是什么,为什么不可以锁升级呢 要是发生了锁升级会导致什么
    • aqs的数据结构 为什么要用single 而不是singalall
    • state变量的作用是什么 用在哪些地方
    • cas是不是一定就比使用sync锁要好 什么情况下用sync锁好一点
    • cas怎么解决的aba问题
    • longadrr原理是什么 是对什么的优化
    • vaolitale为什么不能保证原子性 是怎么导致重排序失效的
    • 线程池原理 参数介绍 平时怎么用的线程池 怎么优雅的监控线程池的关闭
    • 并发工具类有哪些 平时杂用的 原理 区别
    • disruptor的原理 对于阻塞队列优化点在哪 平时杂用的
    • arraynlocingqueqe和linkedbloikingqueue的区别
    • hanppen befor语义 多线程下重排序的问题 解决方法
    • forkjoin思想
    • 设计模式 策略的几种实现 代理uml图 自己项目里面怎么用的 如果一个if else很多的情况下 是不是一定要用策略去改造 这样改造后的优缺点
    • 单例里面的静态内部类的实现
    • 建造者和工厂的区别
    • 继承和内包含的区别
    • spring里面用到设计模式
    • 说下spring你看过的源码流程
    • aop的的通知方法内部执行流程
    • 一个事务中包含多个子事务 怎么解决
    • springboot的spi机制
    • springboot的内嵌tomcat实现原理
    • springboot的自动装配原理
    • mysql的索引原理 有哪些索引 为什么尽量建复合索引 最左侧索引原理 为什么违反就会导致索引失效
    • 索引的数据结构 B+ B树的区别 为啥B+树更快
    • hash索引的场景 是不是都用B+树
    • 如果是一个查询操作很慢你从整体架构到细节怎么排查
    • redis的主从 哨兵 集群分别解决什么问题
    • 主从同步原理 怎么实现的
    • redis可以做哪些事情
    • redis的gossip协议
    • redis的hash算法 一致性hash算法原理
    • 一致性hash算法可以解决负载均衡问题么
    • linux的io模型 indot是什么
    • bio的原理
    • netty项目中的使用 netty中的管道是什么 每条消息的传递原理
    • netty的bytebuf 双指针是什么 零拷贝
    • netty里面怎么解决黏包半包的 tcp滑动窗口是什么 nagle算法 netty
    • 自己实现一个通信协议 尽可能想到完善
    • rpc和http的区别 自己实现一个rpc
    • doss攻击是什么 是怎么钻的漏洞
    • 几种消息中间件的区别 怎么选型 平时项目中用了哪些
    • kafka怎么保证消息不丢失 消息不重复消费 消息有序 消息堆积怎么解决 消息持久化怎么实现的 消息淘汰策略
    • kafka的lsu是什么 保证有序和性能怎么权衡
    • 如果是5个消费者 3个分区 5个消费者都能消费到吗
    • kafka分区在均衡是什么意思 如果我想设置偏移量 怎么设置
    • kafka的副本之间的同步机制
    • 微服务和分布式区别 dubbo用过没有 dubbo的spi dubbo的熔断功能 dubbo支持的一些协议
    • dubbo的整个执行原理 从提供方到消费方的过程
    • springcloud和dubbo的区别 springcloud在项目中怎么用的
    • hystrics原理服务隔离是怎么做的
    • feing的原理
    • 网关统一异常处理是怎么做的 一般你们怎么做的权限 如果是通过网关集成security 前端不加Autchcation 会不会进入网关授权过滤器
    • 画一下你们的架构图数据流,你们系统的伸缩性体现在哪里
    • 一个秒杀场景怎么设计 包括前后端
    • 现在后端日志报了一个事务死锁的bug怎么排查
    • nestat 之后发现有很多wating的进程考虑是什么情况引起的
    • 一个websockt推送的统计数据,程序运行一段时间突然数据不更新了,但是连接还存在,怎么排查,没有任何异常日志
    • 给一个数组找出三个数相加等于数组另一个数的这四个数
    • 树的遍历树图的区别 dfs bfs
    • es的数据结构 倒排索引的原理 es出现中文检索精确度不高的问题
    • es的分词和关键字的区别
    • 分布式锁 分布式事务 cap zab base pacox 2pc 3pc tcc
    • seata和lcn的区别内部实现原理
    • kill调一个进程,怎么保证程序里面的线程优雅结束

    最后

    分享一些资料给大家,我觉得这些都是很有用的东西,大家也可以跟着来学习,查漏补缺。

    完整版获取:狂戳这里免费领取~

    《Java高级面试》

    《Java高级架构知识》

    《算法知识》

    [外链图片转存中…(img-MG8JjCM5-1624867637766)]

    《Java高级架构知识》

    [外链图片转存中…(img-kafd9ifV-1624867637768)]

    《算法知识》

    展开全文
  • 高级Java面试题精选

    2021-02-12 12:59:17
    高级Java面试题精选这是百分网小编为Java开发人员收集整理的面试经常容易遇到的问题,相信你了解和掌握之后一定会有所提高。让我们一起来看看吧。1. 什么是可变参数?2. 断言的用途?3. 什么时候使用断言?4. 什么...

    高级Java面试题精选

    这是百分网小编为Java开发人员收集整理的面试中经常容易遇到的问题,相信你了解和掌握之后一定会有所提高。让我们一起来看看吧。

    3501c5725827081b415bc971809e8d6b.png

    1. 什么是可变参数?

    2. 断言的用途?

    3. 什么时候使用断言?

    4. 什么是垃圾回收?

    5. 用一个例子解释垃圾回收?

    6. 什么时候运行垃圾回收?

    7. 垃圾回收的最佳做法?

    8. 什么是初始化数据块?

    9. 什么是静态初始化器?

    10.什么是实例初始化块?

    11.什么是正则表达式?

    12.什么是令牌化?

    13.给出令牌化的例子?

    14.如何使用扫描器类(Scanner Class)令牌化?

    15.如何添加小时(hour)到一个日期对象(Date Objects)?

    16.如何格式化日期对象?

    17.Java中日历类(Calendar Class)的用途?

    18.如何在Java中获取日历类的实例?

    19.解释一些日历类中的重要方法?

    20.数字格式化类(Number Format Class)的用途?

    什么是可变参数?

    可变参数允许调用参数数量不同的方法。请看下面例子中的求和方法。此方法可以调用1个int参数,或2个int参数,或多个int参数。

    //int(type) followed ... (three dot's) is syntax of a variable argument.

    public int sum(int... numbers) {

    //inside the method a variable argument is similar to an array.

    //number can be treated as if it is declared as int[] numbers;

    int sum = 0;

    for (int number: numbers) {

    sum += number;

    }

    return sum;

    }

    public static void main(String[] args) {

    VariableArgumentExamples example = new VariableArgumentExamples();

    //3 Arguments

    System.out.println(example.sum(1, 4, 5));//10

    //4 Arguments

    System.out.println(example.sum(1, 4, 5, 20));//30

    //0 Arguments

    System.out.println(example.sum());//0

    }

    断言的用途?

    断言是在Java 1.4中引入的。它能让你验证假设。如果断言失败(即返回false),就会抛出AssertionError(如果启用断言)。基本断言如下所示。

    private int computerSimpleInterest(int principal,float interest,int years){

    assert(principal>0);

    return 100;

    }

    什么时候使用断言?

    断言不应该用于验证输入数据到一个public方法或命令行参数。IllegalArgumentException会是一个更好的选择。在public方法中,只用断言来检查它们根本不应该发生的情况。

    什么是垃圾回收?

    垃圾回收是Java中自动内存管理的另一种叫法。垃圾回收的目的是为程序保持尽可能多的可用堆(heap)。 JVM会删除堆上不再需要从堆引用的对象。

    用一个例子解释垃圾回收?

    比方说,下面这个方法就会从函数调用。

    void method(){

    展开全文
  • Java高级面试题及答案

    2021-03-06 03:26:22
    2.HashSet 是哈希表实现的,HashSet的数据是无序的,可以放入null,但只能放入一个null,两者的值都不能重复,就如数据库唯一约束 。 3.HashSet要求放入的对象必须实现HashCode()方法,放入的对象,是以...

    List和Set比较,各自的子类比较

    对比一:Arraylist与LinkedList的比较

    1、ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高(在内存里是连着放的)。

    2、因为地址连续, ArrayList要移动数据,所以插入和删除操作效率比较低。

    3、LinkedList基于链表的数据结构,地址是任意的,所以在开辟内存空间的时候不需要等一个连续的地址,对于新增和删除操作add和remove,LinedList比较占优势。

    4、因为LinkedList要移动指针,所以查询操作性能比较低。

    适用场景分析:

    当需要对数据进行对此访问的情况下选用ArrayList,当需要对数据进行多次增加删除修改时采用LinkedList。

    对比二:ArrayList与Vector的比较

    1、Vector的方法都是同步的,是线程安全的,而ArrayList的方法不是,由于线程的同步必然要影响性能。因此,ArrayList的性能比Vector好。

    2、当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样。ArrayList就有利于节约内存空间。

    3、大多数情况不使用Vector,因为性能不好,但是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性。

    4、Vector可以设置增长因子,而ArrayList不可以。

    适用场景分析:

    1、Vector是线程同步的,所以它也是线程安全的,而ArrayList是线程异步的,是不安全的。如果不考虑到线程的安全因素,一般用ArrayList效率比较高。

    2、如果集合中的元素的数目大于目前集合数组的长度时,在集合中使用数据量比较大的数据,用Vector有一定的优势。

    对比三:HashSet与TreeSet的比较

    1.TreeSet 是二叉树实现的,Treeset中的数据是自动排好序的,不允许放入null值 。

    2.HashSet 是哈希表实现的,HashSet中的数据是无序的,可以放入null,但只能放入一个null,两者中的值都不能重复,就如数据库中唯一约束 。

    3.HashSet要求放入的对象必须实现HashCode()方法,放入的对象,是以hashcode码作为标识的,而具有相同内容的String对象,hashcode是一样,所以放入的内容不能重复。但是同一个类的对象可以放入不同的实例。

    适用场景分析:

    HashSet是基于Hash算法实现的,其性能通常都优于TreeSet。我们通常都应该使用HashSet,在我们需要排序的功能时,我们才使用TreeSet。

    HashMap和ConcurrentHashMap的区别

    1、HashMap不是线程安全的,而ConcurrentHashMap是线程安全的。

    2、ConcurrentHashMap采用锁分段技术,将整个Hash桶进行了分段segment,也就是将这个大的数组分成了几个小的片段segment,而且每个小的片段segment上面都有锁存在,那么在插入元素的时候就需要先找到应该插入到哪一个片段segment,然后再在这个片段上面进行插入,而且这里还需要获取segment锁。

    3、ConcurrentHashMap让锁的粒度更精细一些,并发性能更好。

    JVM的内存结构

    根据 JVM 规范,JVM 内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。

    1、Java虚拟机栈:

    线程私有;每个方法在执行的时候会创建一个栈帧,存储了局部变量表,操作数栈,动态连接,方法返回地址等;每个方法从调用到执行完毕,对应一个栈帧在虚拟机栈中的入栈和出栈。

    2、堆:

    线程共享;被所有线程共享的一块内存区域,在虚拟机启动时创建,用于存放对象实例。

    3、方法区:

    线程共享;被所有线程共享的一块内存区域;用于存储已被虚拟机加载的类信息,常量,静态变量等。

    4、程序计数器:

    线程私有;是当前线程所执行的字节码的行号指示器,每条线程都要有一个独立的程序计数器,这类内存也称为“线程私有”的内存。

    5、本地方法栈:

    线程私有;主要为虚拟机使用到的Native方法服务。

    强引用,软引用和弱引用的区别

    强引用:

    只有这个引用被释放之后,对象才会被释放掉,只要引用存在,垃圾回收器永远不会回收,这是最常见的New出来的对象。

    软引用:

    内存溢出之前通过代码回收的引用。软引用主要用户实现类似缓存的功能,在内存足够的情况下直接通过软引用取值,无需从繁忙的真实来源查询数据,提升速度;当内存不足时,自动删除这部分缓存数据,从真正的来源查询这些数据。

    弱引用:

    第二次垃圾回收时回收的引用,短时间内通过弱引用取对应的数据,可以取到,当执行过第二次垃圾回收时,将返回null。弱引用主要用于监控对象是否已经被垃圾回收器标记为即将回收的垃圾,可以通过弱引用的isEnQueued方法返回对象是否被垃圾回收器标记。

    springmvc的核心是什么,请求的流程是怎么处理的,控制反转怎么实现的

    核心:

    控制反转和面向切面

    请求处理流程:

    1、首先用户发送请求到前端控制器,前端控制器根据请求信息(如URL)来决定选择哪一个页面控制器进行处理并把请求委托给它,即以前的控制器的控制逻辑部分;

    2、页面控制器接收到请求后,进行功能处理,首先需要收集和绑定请求参数到一个对象,并进行验证,然后将命令对象委托给业务对象进行处理;处理完毕后返回一个ModelAndView(模型数据和逻辑视图名);

    3、前端控制器收回控制权,然后根据返回的逻辑视图名,选择相应的视图进行渲染,并把模型数据传入以便视图渲染;

    4、前端控制器再次收回控制权,将响应返回给用户。

    控制反转如何实现:

    我们每次使用spring框架都要配置xml文件,这个xml配置了bean的id和class。

    spring中默认的bean为单实例模式,通过bean的class引用反射机制可以创建这个实例。

    因此,spring框架通过反射替我们创建好了实例并且替我们维护他们。

    A需要引用B类,spring框架就会通过xml把B实例的引用传给了A的成员变量。

    BIO、NIO和AIO的区别

    Java BIO : 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。

    Java NIO : 同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。

    Java AIO: 异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。

    NIO比BIO的改善之处是把一些无效的连接挡在了启动线程之前,减少了这部分资源的浪费(因为我们都知道每创建一个线程,就要为这个线程分配一定的内存空间)

    AIO比NIO的进一步改善之处是将一些暂时可能无效的请求挡在了启动线程之前,比如在NIO的处理方式中,当一个请求来的话,开启线程进行处理,但这个请求所需要的资源还没有就绪,此时必须等待后端的应用资源,这时线程就被阻塞了。

    适用场景分析:

    BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解,如之前在Apache中使用。

    NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持,如在 Nginx,Netty中使用。

    AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持,在成长中,Netty曾经使用过,后来放弃。

    为什么要用线程池

    那先要明白什么是线程池

    线程池是指在初始化一个多线程应用程序过程中创建一个线程集合,然后在需要执行新的任务时重用这些线程而不是新建一个线程。

    使用线程池的好处

    1、线程池改进了一个应用程序的响应时间。由于线程池中的线程已经准备好且等待被分配任务,应用程序可以直接拿来使用而不用新建一个线程。

    2、线程池节省了CLR 为每个短生存周期任务创建一个完整的线程的开销并可以在任务完成后回收资源。

    3、线程池根据当前在系统中运行的进程来优化线程时间片。

    4、线程池允许我们开启多个任务而不用为每个线程设置属性。

    5、线程池允许我们为正在执行的任务的程序参数传递一个包含状态信息的对象引用。

    6、线程池可以用来解决处理一个特定请求最大线程数量限制问题。

    悲观锁和乐观锁的区别,怎么实现

    悲观锁:一段执行逻辑加上悲观锁,不同线程同时执行时,只能有一个线程执行,其他的线程在入口处等待,直到锁被释放。

    乐观锁:一段执行逻辑加上乐观锁,不同线程同时执行时,可以同时进入执行,在最后更新数据的时候要检查这些数据是否被其他线程修改了(版本和执行初是否相同),没有修改则进行更新,否则放弃本次操作。

    悲观锁的实现:

    begin;/begin work;/start transaction; (三者选一就可以)

    //1.查询出商品信息

    select status from t_goods where id=1 for update;

    //2.根据商品信息生成订单

    insert into t_orders (id,goods_id) values (null,1);

    //3.修改商品status为2

    update t_goods set status=2;

    //4.提交事务

    commit;/commit work;

    乐观锁的实现:

    1.查询出商品信息

    select (status,status,version) from t_goods where id=#{id}

    2.根据商品信息生成订单

    3.修改商品status为2

    update t_goods

    set status=2,version=version+1

    where id=#{id} and version=#{version};

    什么是线程死锁?死锁如何产生?如何避免线程死锁?

    死锁的介绍:

    线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行。当线程进入对象的synchronized代码块时,便占有了资源,直到它退出该代码块或者调用wait方法,才释放资源,在此期间,其他线程将不能进入该代码块。当线程互相持有对方所需要的资源时,会互相等待对方释放资源,如果线程都不主动释放所占有的资源,将产生死锁。

    死锁的产生的一些特定条件:

    1、互斥条件:进程对于所分配到的资源具有排它性,即一个资源只能被一个进程占用,直到被该进程释放 。

    2、请求和保持条件:一个进程因请求被占用资源而发生阻塞时,对已获得的资源保持不放。

    3、不剥夺条件:任何一个资源在没被该进程释放之前,任何其他进程都无法对他剥夺占用。

    4、循环等待条件:当发生死锁时,所等待的进程必定会形成一个环路(类似于死循环),造成永久阻塞。

    如何避免:

    1、加锁顺序:

    当多个线程需要相同的一些锁,但是按照不同的顺序加锁,死锁就很容易发生。如果能确保所有的线程都是按照相同的顺序获得锁,那么死锁就不会发生。当然这种方式需要你事先知道所有可能会用到的锁,然而总有些时候是无法预知的。

    2、加锁时限:

    加上一个超时时间,若一个线程没有在给定的时限内成功获得所有需要的锁,则会进行回退并释放所有已经获得的锁,然后等待一段随机的时间再重试。但是如果有非常多的线程同一时间去竞争同一批资源,就算有超时和回退机制,还是可能会导致这些线程重复地尝试但却始终得不到锁。

    3、死锁检测:

    死锁检测即每当一个线程获得了锁,会在线程和锁相关的数据结构中(map、graph等等)将其记下。除此之外,每当有线程请求锁,也需要记录在这个数据结构中。死锁检测是一个更好的死锁预防机制,它主要是针对那些不可能实现按序加锁并且锁超时也不可行的场景。

    展开全文
  • 前言 Spring 框架自诞生以来一直备受开发者青睐,有人亲切的称之为:Spring 全家桶。...所以这是重点也是难点,工作必须会,面试时肯定考。 Part1 SpringIOC 学习Spring最重要的无非是Spring IOC以及Spring AO
  • Java中高级面试题整理

    2021-03-03 11:38:28
    10)数组在内存如何分配; 11)用过哪些设计模式,手写一个(除单例); 12)springmvc的核心是什么,请求的流程是怎么处理的,控制反转怎么实现的; 13)spring里面的aop的原理是什么; 14)mybatis如何处理结果...
  • java中高级面试题整理

    2021-03-06 08:49:55
    java中高级面试题整理 问题 答案 java编程如何保证多线程运行安全? 线程的安全性问题体现在: 原子性:一个或者多个操作在CPU执行的过程中不被中断的特性 可见性:一个线程对共享变量的修改,另外...
  • 这是一个高级Java面试系列题中的***部分。这一部分论述了可变参数,断言,垃圾回收,初始化器,令牌化,日期,日历等等Java核心问题。什么是可变参数?断言的用途?什么时候使用断言?什么是垃圾回收?用一个例子解释...
  • 这是一个高级Java面试系列题中的第一部分。这一部分论述了可变参数,断言,垃圾回收,初始化器,令牌化,日期,日历等等Java核心问题。1. 什么是可变参数?可变参数允许调用参数数量不同的方法。请看下面例子的...
  • java高级工程师笔试题

    2021-03-13 02:59:06
    java高级工程师笔试题选择题1:which is the main() method return of a application?a.stringb.bytec.chard.void2:what will happen when you attempt to compile and run the following code?int output = 10;...
  • 容器化时代来了 虚拟化技术已经走过了三个时代...容器化解决了软件开发过程一个令人非常头疼的问题,用一段对话描述: 测试人员:你这个功能有问题。 开发人员:我本地是好的啊。 开发人员编写代码,在自己本地环境
  • 这就是这篇文章的目的,**帮你搜集了大量的面试题,已经整理成了一个Java面试手册PDF,《互联网面试2400页》,目前有65份PDF,共有2400多页,**后续还会不断的完善更新。 直接进入正题,由于pdf文档里的细节内容...
  • java缓存技术面试题 1、memcache的分布式原理  memcached 虽然称为 “ 分布式 ” 缓存服务器,但服务器端并没有 “ 分布式 ” 功能。每个服务器都是完全独立和隔离的服务。memcached 的分布式,则是完全由客户端...
  • Java高级面试题整理(附答案)

    千次阅读 2021-02-12 12:59:18
    javajava8java开发Java高级面试题整理(附答案) 这是我收集的10道高级Java面试问题列表。这些问题主要来自 Java 核心部分 ,不涉及 Java EE 相关问题。你可能知道这些棘手的 Java 问题的答案,或者觉得这些不足以挑战...
  • Java高级面试题小结

    2021-02-28 17:35:35
    这是一个高级Java面试系列题中的第一部分。这一部分论述了可变参数,断言,垃圾回收,初始化器,令牌化,日期,日历等等Java核心问题。接下来我们就看看具体都有哪些问题。1.什么是可变参数?2.断言的用途?3.什么...
  • java高级工程师面试题及答案解析

    万次阅读 2021-03-07 03:50:08
    面试永远是程序员迈向成功的第一个门槛,想要面试成功,各种面试题的洗礼是必不可少的,下面就来看看小编精心整理的一些java高级工程师面试题及答案吧。一、堆的年轻代和老年代怎么理解?堆的年轻代大则老年代小,GC...
  • 最近几天,有的人在偷偷地买蚂蚁的基金,有的人却偷偷的在蚂蚁面试。 最近确实是面试的好时候。大家都奔着大厂去的,最近也分享了好多大厂的面经了,什么阿里、字节、京东、美团、百度、腾讯、滴滴、网易…已经数...
  • 面试字节跳动,拼多多这种大厂肯定躲避不了算法的,相信面试过的小伙伴都知道,不管在现场面还是视频面肯定都会被问到算法,难度是要比笔试的时候容易些的。 不多扯,如果你是应届毕业生、学了一年多Java的知识...
  • 所以这里整理了一份阿里、美团、滴滴、头条等大厂面试大全其中概括的知识点有:Java基础、spring、springmvc、springboot、springcloud、JVM、Tomcat、dubbo、netty、zookeeper共有500+道面试题 面试题整理十分全面...
  • 原标题:【分享】20个高级Java面试题汇总(含答案)什么是可变参数?可变参数允许调用参数数量不同的方法。请看下面例子的求和方法。此方法可以调用1个int参数,或2个int参数,或多个int参数。 断言的用途?断言是在...
  • JAVA 高级编程笔试题

    2021-03-01 07:20:37
    《使用Java实现面向对象编程》阶段测试-笔试试卷一、选择(共25,每4分,满分100分)1)下列选项关于Java中ArrayList、LinkedList、HashMap三个类的描述错误的是(C)。A.ArrayList和LinkedList均实现了List接口B...
  • 2、 如果一个Java进程突然消失了,你会怎么去排查这种问题? 3、 给了一段Spring加载Bean的代码片段,阐述一下具体的执行流程? 是不是看上去很难,是不是和自己准备的“题库”的问题不一样?不知道从何处下手?...
  • (1)SpringBoot 面试专题 什么是 Spring Boot? Spring Boot 有哪些优点? 什么是 JavaConfig? 如何重新加载 Spring Boot 上的更改,而无需重新启动服务器? Spring Boot 的监视器是什么? 如何在 Spring Boot ...
  • Java 高级编程笔试题

    2021-02-12 11:31:53
    Java 高级编程笔试题 《使用Java实现面向对象编程》阶段测试-笔试试卷 一、选择题(共25题,每题4分,满分100分) 1)下列选项关于Java中ArrayList、LinkedList、HashMap三个类的描述错误的是( )。 A.ArrayList和...
  • 需要注意Jdk 1.8对HashMap的实现做了优化,当链表的节点数据超过八个之后,该链表会转为红黑树来提高查询效率,从原来的O(n)到O(logn) 24. 说一下 HashSet 的实现原理? HashSet底层由HashMap实现 HashSet的值...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 65,029
精华内容 26,011
关键字:

中高级java面试题

java 订阅