《Java 核心技术面试》课程笔记(十一)

news2024/11/26 18:49:03

Java 提供了哪些 IO 方式?

典型回答

  • Java IO 基于不同的 IO 抽象模型和交互方式,可以分为:
    • BIO,传统的 java.io 包,它基于流模型实现。
      • 提供了我们最熟知的⼀些 IO 功能,比如 File 抽象、输入输出流等。
      • 交互方式是同步阻塞的方式,也就是说,在读取输入流或者写入输出流时,在读、写动作完成之前,线程会⼀直阻塞在那里,它们之间的调用是可靠的线性顺序。
      • java.net 提供的部分网络 API,比如 Socket、ServerSocket、HttpURLConnection 也归类到同步阻塞 IO 类库,因为网络通信同样是 IO 行为。
    • NIO,java.nio 包,提供了 Channel、Selector、Buffer 等新的抽象。
      • 可以构建多路复用的、同步非阻塞 IO 程序
      • 同时提供了更接近操作系统底层的高性能数据操作方式。
    • AIO(Asynchronous IO),也就是 NIO 2,引入了异步非阻塞 IO 方式。
      • 异步 IO 操作基于事件和回调机制。
      • 应用操作直接返回,而不会阻塞在那里,当后台处理完成,操作系统会通知相应线程进行后续工作。

考点分析

  • 在实际面试中,从传统 IO 到 NIO、NIO 2,其中有很多地方可以扩展开来,考察点涉及方方面面:
    • 基础 API 功能与设计,InputStream/OutputStream 和 Reader/Writer 的关系和区别。
    • NIO、NIO 2 的基本组成。
    • 给定场景,分别用不同模型实现,分析 BIO、NIO 等模式的设计和实现原理。
    • NIO 提供的高性能数据操作方式是基于什么原理,如何使用?
    • 从开发者的角度来看,你觉得 NIO 自身实现存在哪些问题?有什么改进的想法吗?

知识扩展

  • 区分同步或异步(synchronous/asynchronous)。
    • 简单来说,同步是⼀种可靠的有序运行机制,当我们进行同步操作时,后续的任务是等待当前调用返回,才会进行下⼀步;
    • 异步则相反,其他任务不需要等待当前调用返回,通常依靠事件、回调等机制来实现任务间次序关系。
  • 区分阻塞与非阻塞(blocking/non-blocking)。
    • 在进行阻塞操作时,当前线程会处于阻塞状态,无法从事其他任务,只有当条件就绪才能继续,比如 ServerSocket 新连接建立完毕,或数据读取、写入操作完成;
    • 非阻塞则是不管 IO 操作是否结束,直接返回,相应操作在后台继续处理。
  • 不能⼀概而论认为同步或阻塞就是低效,具体还要看应用和系统特征。
    • IO 不仅仅是对文件的操作,网络编程中,比如 Socket 通信,都是典型的 IO 操作目标。
    • 输入流、输出流(InputStream/OutputStream)是用于读取或写入字节的,例如操作图片文件。
    • Reader/Writer 则是用于操作字符,增加了字符编解码等功能,适用于类似从文件中读取或者写入文本信息,本质上计算机操作的都是字节。
    • BufferedOutputStream 等带缓冲区的实现,可以避免频繁的磁盘读写,进而提高 IO 处理效率。这种设计利用了缓冲区,将批量数据进行⼀次操作,但在使用中千万别忘了 flush。
      在这里插入图片描述
  • Java NIO 多路复用机制
    • Buffer,高效的数据容器,除了布尔类型,所有原始数据类型都有相应的 Buffer 实现。
    • Channel,类似在 Linux 之类操作系统上看到的文件描述符,是 NIO 中被用来支持批量式 IO 操作的⼀种抽象。
    • Selector,是 NIO 实现多路复用的基础,它同样是基于底层操作系统机制,可以检测到注册在 Selector 上的多个 Channel 中,是否有 Channel 处于就绪状态,进而实现了单线程对多 Channel 的高效管理。
    • NIO 利用了单线程轮询事件的机制,通过高效地定位就绪的 Channel,来决定做什么,仅仅 select 阶段是阻塞的,可以有效避免大量客户端连接时,频繁线程切换带来的问题,应用的扩展能力有了非常大的提高。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/551614.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安装编译PostgreSql15.3.0

一、下载源码 方式一 官网手动下载 https://www.postgresql.org/download/. 解压 tar -zxvf postgresql-14.2.tar.gz方式二 git clone git clone https://github.com/postgres/postgres.git解压或下载后计入postgres目录 cd postgres-15.3二、创建目录 用root账户创建 创建…

[iOS开发]<多线程-NSOperation操作队列NSOperationQueue>

前言 寒假期间学习过GCD。今天学习NSOperation。同样都是多线程封装,NSOperation和NSOperationQueue是基于GCD的更高一层的封装,完全的面向对象,相比于GCD复杂的各种API方法,它的优势就是更加的简单实用,代码的可读性…

电力电子课设—数控产生PWM波——使用51单片机输出占空比可调PWM波(按钮控制、数码管显示)控制速成教程

我们学校电气专业开始做电力电子的课设了,小组选了一项制作硬件电路的任务,里面有要求采用数控方式实现DC-DC电压变换的输出电压调节,数控在电路中的体现就是用单片机输出可调占空比的PWM作用于产生PWM波控制IGBT的芯片。考虑到可能有同学没接…

金领冠520解密母乳源代码,助推婴配粉中国式现代化高速发展

又是一年520,又是一个“全国母乳喂养宣传日”。 1990年5月10日,为保护、促进和支持母乳喂养,更好地实行优生优育,原中华人民共和国国家卫生部召开新闻发布会,确立每年5月20日为“全国母乳喂养宣传日”。 那时&#x…

[GXYCTF2019]BabySQli1

拿到题目一看就是sql注入,所以还是老样子账号admin密码随便输入,回显但是密码错误 当用户名随便输入时,回显用户名错误,说明是先检测用户名,再检测密码 应该是存在过滤 通过burp爆破大致找出过滤字符,还有就…

css flex布局

css flex布局 flex是flexible Box的缩写,意为“弹性布局”,任何一个容器都可以指定为flex布局。 当我们为父盒子设为flex布局以后,子元素的float、clear和vertical-align属性将失效 总结flex布局原理: 就是通过给父盒子添加fl…

Java - AQS(一)

Java - AQS(一) 在Java中,AQS代表AbstractQueuedSynchronizer(抽象队列同步器)。AQS是Java并发包中用于构建同步器的基础框架。它提供了一种实现同步状态管理、线程等待和通知的机制。 AQS主要通过一个int类型的状态…

轻松玩转开源大语言模型bloom(四)

前言 前几篇都围绕着语言模型的decoding strategy来讲述,今天将进入进阶篇,在解码策略效果有限和提示词修改也无法满意的情况下如何提升模型的效果呢?这时我们需要对大语言模型进行fine-tune,即微调。一般我们用的大语言模型都是…

chatgpt赋能Python-python5个数从小到大排序

Python中的5个数从小到大排序 在Python中,排序是一个常见的操作。我们经常需要对一组数据进行排序,以便更方便地对数据进行分析和处理。在本文中,我们将探讨Python中如何排序5个数,具体来说,是从小到大排序。 介绍 …

chatgpt赋能Python-python5__3

Python5%-3: 介绍和结论 什么是Python5%-3 Python5%-3是在Python 3语言版本中增加的一个新特性,它是Python语言中对移动开发的支持扩展,这个特性被称为Python5%-3。 具体来说,Python5%-3允许开发者能够更方便地创建移动应用程序&#xff0…

大脑MRI去噪技术研究进展

导读 磁共振(MR)图像诊断的准确性取决于图像的质量,而图像质量下降的主要原因是由于噪声和伪影。噪声是由成像环境错误或传输系统失真所引起的。因此,去噪方法对提高图像质量起着重要作用。然而,在去噪和保留结构细节之间需要权衡。现有的大…

【Linux】Linux 下的权限(初)

d1 目录下有目录dir,和一个普通文件 test.c 重点看到文件的各种权限,拆分清晰地理解(重) 观察到权限和文件类型一坨除了第一列的文件类型其他的都是文件相关的权限,而且是三个三个分开 为什么分开呢?是因为…

【leetcode】456. 132 模式 单调栈出栈特性

看题意是要在数组中找到一个大于左右元素波峰。 一开始看数据量是 10e5,还以为是 nlogn算法。没想到居然是个 n 的单调栈。 这道题利用了递减单调栈出栈的特性, 出栈元素 k、栈中某一个特定元素 j 满足 nums[j] > nums[k],如果从数组后面向前遍历的…

什么是uni-app?为什么要学习uni-app?

文章目录 前言 一、什么是uni-app框架? 二、为什么要学? 三、uni-app开发的适用场景是什么? 总结 前言 随着前端技术的不断发展进步,跨端开发成为了程序猿不得不面临的一个难题,uni-app的出现解决了程序猿不断重复…

《Java 核心技术面试》课程笔记(十)

如何保证集合是线程安全的? 典型回答 Java 提供了不同层⾯的线程安全支持。 在传统集合框架内部,除了 Hashtable 等同步容器,还提供了所谓的同步包装器(Synchronized Wrapper),我们可以调用 Collections 工具类提供…

16款ChatGPT工具,太炸裂了,收藏!

1.ChatGPT for google 一个浏览器插件,可搭配现有的搜索引擎来使用。 最大化搜索效率,对搜索体验的提升相当离谱: 安装完插件后,在搜索引擎搜索任何问题,都能获取两份答案。 左边是谷歌抓取的全网资源,右…

完美解决:“因为计算机丢失VCRUNTIME140_1.dll”

VCRUNTIME140_1.dll是Microsoft Visual C Redistributable的一个组件,它包含了许多用于C编程的函数和类。如果你的系统缺少了这个文件,那么你可能会遇到“找不到VCRUNTIME140_1.dll无法继续执行代码”的错误提示。 方法1:直接复制VCRUNTIME…

python多进程与多线程

1 Python多线程 1.1 GIL 其他语言,CPU是多核时是支持多个线程同时执行。但在Python中,无论是单核还是多核,同时只能由一个线程在执行。其根源是GIL的存在。GIL的全称是Global Interpreter Lock(全局解释器锁),来源是Python设计之…

[MySQL]事务的浅谈

欲买桂花同载酒 终不似 少年游 目录 1.MySQL为什么需要事务 2.MySQL对事务的支持 3.关于事务的操作 控制方式(对于单条SQL) 控制方式二(START TRANSACTION 或 BEGIN) 4.关于ACID 5.关于事务的隔离级别 5.1事务可能存在的问题 5.2事务隔离级别 5.3难点(RR 级别 …

Autosar RTE S/R接口implicit与Explicit的实现与区别

文章目录 前言接口的代码implicitIReadIWrite ExplicitReadWrite 区别与使用场景总结 前言 Autosar官方文档阅读起来比较费劲,一般从实际应用中来了解更多规范中的内容。本文介绍最常用的RTE S/R接口的implicit隐式与Explicit显式两种方式的实现与差别 接口的代码…