Java中级面试题及答案解析(4)

Java中级面试题及答案解析(4)点击上方“Java知音”,选择“置顶公众号”技术文章第一时间送达!知音专栏 Javaweb练手项目源码下载常用设计模式完整系列篇100套IT类简历模板下载Java常见面试题汇总篇这里选了几道高频面试题以及一些解答。不一定全部正确,有一些是没有固定答案的,如果发现有错误的欢迎纠正,如果有更好的回答,热烈欢迎留言探讨。BIO、NIO和AIO的区别JavaBIO:同步并阻塞,服务器实现模式为一个连…

大家好,又见面了,我是你们的朋友全栈君。

点击上方“Java知音”,选择“置顶公众号”

技术文章第一时间送达!


知音专栏

 

Javaweb练手项目源码下载

常用设计模式完整系列篇

100套IT类简历模板下载

Java常见面试题汇总篇


这里选了几道高频面试题以及一些解答。不一定全部正确,有一些是没有固定答案的,如果发现有错误的欢迎纠正,如果有更好的回答,热烈欢迎留言探讨。


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曾经使用过,后来放弃。


类似参考文章,请移驾:

Java中BIO,NIO,AIO的理解



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


栈是一种具有后进先出性质的数据结构,也就是说后存放的先取,先存放的后取。


堆是一种经过排序的树形数据结构,每个结点都有一个值。通常我们所说的堆的数据结构,是指二叉堆。堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。由于堆的这个特性,常用来实现优先队列,堆的存取是随意的。


为什么要划分堆和栈

1、从软件设计的角度看,栈代表了处理逻辑,而堆代表了数据。这样分开,使得处理逻辑更为清晰。


2、堆与栈的分离,使得堆中的内容可以被多个栈共享。一方面这种共享提供了一种有效的数据交互方式(如:共享内存),另一方面,堆中的共享常量和缓存可以被所有栈访问,节省了空间。


3、栈因为运行时的需要,比如保存系统运行的上下文,需要进行地址段的划分。由于栈只能向上增长,因此就会限制住栈存储内容的能力。而堆不同,堆中的对象是可以根据需要动态增长的,因此栈和堆的拆分,使得动态增长成为可能,相应栈中只需记录堆中的一个地址即可。


4、体现了Java面向对象这一核心特点(也可以继续说一些自己的理解)


类似参考文章,请移驾:

Java中堆内存和栈内存详解





为什么要用线程池


那先要明白什么是线程池

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


使用线程池的好处

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


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


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


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


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


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


类似参考文章,请移驾:

JAVA线程池原理详解(1)

JAVA线程池原理详解(2)

Java多线程和线程池






msyql优化经验


1、对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。


2、应尽量避免在 where 子句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描。


3、尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。


4、任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。


5、避免频繁创建和删除临时表,以减少系统表资源的消耗。诸如此类,等等等等……


类似参考文章,请移驾:

关键的十个MySQL性能优化技巧

MySQL索引优化




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


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


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


悲观锁的实现:

//0.开始事务
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,versionfrom t_goods where id=#{ id}
2.根据商品信息生成订单
3.修改商品status2
update t_goods 
set status=2,version=version+1
where id=#{ idand version=#{ version};


类似参考文章,请移驾:

Java高并发解决方案(参考文)

Java中级面试题及答案解析(4)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149961.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Android虚拟机连接网络

    Android虚拟机连接网络点击查看

    2022年6月16日
    30
  • jlink接口定义接stm32_图解Stm32使用jlink程序时jtag接口(SW和JTAG模式)的简化方法

    jlink接口定义接stm32_图解Stm32使用jlink程序时jtag接口(SW和JTAG模式)的简化方法用过STm32的人都知道stm32有两种常用程序的方法,用串口和jlink。串口方法和51差不多不多说,用jlink时接口引脚太多导致接口很大,很占pcb的面积,在此我就针对这个问题清晰的讲述下jlink程序时jtag接口的简化方法!希望对大家有用。!我实验的是jlinkv8和stm32f103rbt6!如果用jtag模式的话,需要接:jlink的第1脚(VDD)、第3脚(TRST对应stm32…

    2022年5月28日
    80
  • 台式硬盘接口详解_台式机主板硬盘接口

    台式硬盘接口详解_台式机主板硬盘接口2016-12-1612:16:44扩展分区类似于一个完整的硬盘,必须进一步分区才能使用。但每个扩展分区中只能存在一个其他分区。此分区在DOS/Windows环境中即为逻辑盘。因此每一个扩展分区的分区表(同样存储在扩…2016-12-2413:34:30你好这个简单方法如下:1、把SATA数据线的一头,插在主板的SATA接口上。如果有多块硬盘,要把启动盘接在第一个口上。如果硬盘是sat…

    2025年6月14日
    2
  • sqlserverjdbc驱动下载教程(jdbc driver)

    下载地址:https://docs.microsoft.com/zh-cn/sql/connect/jdbc/download-microsoft-jdbc-driver-for-sql-server?view=sql-server-2017

    2022年4月15日
    44
  • python分组聚合_python爬虫标签

    python分组聚合_python爬虫标签由于某些原因,回归和分类问题总会引起机器学习领域的大部分关注。多标签分类在数据科学中是一个比较令人头疼的问题。在这篇文章中,我将给你一个直观的解释,说明什么是多标签分类,以及如何解决这个问题。1.多标签分类是什么?让我们来看看下面的图片。如果我问你这幅图中有一栋房子,你会怎样回答?选项为“Yes”或“No”。或者这样问,所有的东西(或标签)与这幅图有什么关系?在这些类型的问题中,我们有一组目标变…

    2025年7月22日
    5
  • arcgis runtime for android 100.13.0 入门系列,一、初步引入与运行

    arcgis runtime for android 100.13.0 入门系列,一、初步引入与运行这是我来到csdn以来写的第一篇文章,希望能通过文字能把我的学习经过与心得分享给大家。我使用的是Kotlin来编写代码,我将默认各位具有一定的Android编程基础。言归正传,我们接下来要做的第一件事情就是使用AndroidStudio来创建一个空的新项目了我接下来的操作都是遵循arcgisandroid官方进行搭建的,读者看到的时候可能已经出了新的版本了,不过应该是小版本,arcgisandroid主体代码结构应该是不会变的,请放心阅读与搭建欢迎加入我们的QQ交流群249819194.

    2022年7月17日
    14

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号