Java面试大全(2020年版)31-40

31.当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

分几种情况
1).其他方法前是否加了synchronized关键字,如果没加,则能。
2).如果这个方法内部调用了wait,则可以进入其他synchronized方法。
3).如果其他个方法都加了synchronized关键字,并且内部没有调用wait,则不能。
4).如果其他方法是static,它用的同步锁是当前类的字节码,与非静态的方法不能同步,因为非静态的方法用的是this。

32.线程的基本概念、线程的基本状态以及状态之间的关系

①一个程序中可以有多条执行线索同时执行,一个线程就是程序中的一条执行线索,每个线程上都关联有要执行的代码,即可以有多段程序代码同时运行,每个程序至少都有一个线程,即main方法执行的那个线程。(如果只是一个cpu,它怎么能够同时执行多段程序呢?这是从宏观上来看的,cpu一会执行a线索,一会执行b线索,切换时间很快,给人的感觉是a,b在同时执行,好比大家在同一个办公室上网,只有一条链接到外部网线,其实,这条网线一会为a传数据,一会为b传数据,由于切换时间很短暂,所以,大家感觉都在同时上网。)
②线程基本状态:就绪,运行,synchronize阻塞,wait和sleep挂起,结束。wait必须在synchronized内部调用。调用线程的start方法后线程进入就绪状态,线程调度系统将就绪状态的线程转为运行状态,遇到synchronized语句时,由运行状态转为阻塞,当synchronized获得锁后,由阻塞转为运行,在这种情况可以调用wait方法转为挂起状态,当线程关联的代码执行完后,线程变为结束状态。

33.简述synchronized和java.util.concurrent.locks.Lock的异同?

主要相同点:Lock能完成synchronized所实现的所有功能
主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。Lock还有更强大的功能,例如,它的tryLock方法可以非阻塞方式去拿锁。

34.java中有几种类型的流?

字符流和字节流。字节流继承inputStream和OutputStream,字符流继承自InputSteamReader和OutputStreamWriter。

35.谈谈Java IO里面的常见类,字节流,字符流、接口、实现类、方法阻塞

输入流就是从外部文件输入到内存,输出流主要是从内存输出到文件。
IO流主要分为字符流和字节流。
①字符流中有抽象类InputStream和OutputStream,它们的子类FileInputStream,FileOutputStream,BufferedOutputStream等。
②字符流BufferedReader和Writer等。都实现了Closeable, Flushable,
③Appendable这些接口。程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件。
④java中的阻塞式方法是指在程序调用改方法时,必须等待输入数据可用或者检测到输入结束或者抛出异常,否则程序会一直停留在该语句上,不会执行下面的语句。比如read()和readLine()方法。

36.字符流和字节流有什么区别?

字符流以字符或者字符数组的形式读写数据,只能读写二进制文件;字节流能读写各种类型的数据。
字节流与字符流的不同是他们的处理方式,字节流是最基本的,采用ASCII编码。
但是实际上很多数据是文本,所以提出字符流的概念,采用unicode编码
两者之间通过inputStreamReader与outputStreamWriter来关联,实际上是通过byte[]与String来关联
字节流输出: 程序–>字节流–>文件
字符流输出:程序–>字符流–>缓冲–>文件
程序中所有的数据都是以流的方式进行传输与保存的
在关闭字符流后会强制性的将缓冲区的数据输出,若没有关闭缓冲区的内容是无法输出的,
如果想不关闭并且还想输出缓冲区的内容,用writer类的flush()方法来完成,

37.讲讲NIO

看了一些文章,传统的IO流是阻塞式的,会一直监听一个ServerSocket,在调用read等方法时,他会一直等到数据到来或者缓冲区已满时才返回。调用accept也是一直阻塞到有客户端连接才会返回。每个客户端连接过来后,服务端都会启动一个线程去处理该客户端的请求。并且多线程处理多个连接。每个线程拥有自己的栈空间并且占用一些 CPU 时间。每个线程遇到外部未准备好的时候,都会阻塞掉。阻塞的结果就是会带来大量的进程上下文切换。
对于NIO,它是非阻塞式,核心类:
1.Buffer为所有的原始类型提供 (Buffer)缓存支持。
2.Charset字符集编码解码解决方案
3.Channel一个新的原始I/O抽象,用于读写Buffer类型,通道可以认为是一种连接,可以是到特定设备,程序或者是网络的连接。

38.BufferedReader属于哪种流,它主要是用来做什么的,它里面有那些经典的方法

属于处理流中的缓冲流,可以将读取的内容存在内存里面,有readLine()方法

39.什么是节点流,什么是处理流,它们各有什么用处,处理流的创建有什么特征

节点流直接与数据源相连,用于输入或者输出处理流:在节点流的基础上对之进行加工,进行一些功能的扩展处理流的构造器必须要 传入节点流的子类

40.如果我要对字节流进行大量的从硬盘读取,要用那个流,为什么

BufferedInputStream使用缓冲流能够减少对硬盘的损伤

原创文章 52 获赞 3 访问量 2447

猜你喜欢

转载自blog.csdn.net/m0_47572402/article/details/106066654
今日推荐