1、以下哪几种方式可用来实现线程间通知和唤醒:(AC )

A、Object.wait/notify/notifyAll

B、ReentrantLock.wait/notify/notifyAll

C、Condition.await/signal/signalAll

D、Thread.wait/notify/notifyAll

分析:

A、Object类中的三个方法wait()、notify()和notifyAll()

1)wait()、notify()和notifyAll()方法是本地方法,并且为final方法,无法被重写。

2)调用某个对象的wait()方法能让当前线程阻塞,并且当前线程必须拥有此对象的monitor(即锁)

3)调用某个对象的notify()方法能够唤醒一个正在等待这个对象的monitor的线程,如果有多个线程都在等待这个对象的monitor,则只能唤醒其中一个线程;

4)调用notifyAll()方法能够唤醒所有正在等待这个对象的monitor的线程;

B、ReentrantLock使用lock和unlock

C、Condition是在java 1.5中才出现的,它用来替代传统的Object的wait()、notify()实现线程间的协作,相比使用Object的wait()、notify(),使用Condition1的await()、signal()这种方式实现线程间协作更加安全和高效。因此通常来说比较推荐使用Condition,在阻塞队列那一篇博文中就讲述到了,阻塞队列实际上是使用了Condition来模拟线程间协作。

  • Condition是个接口,基本的方法就是await()和signal()方法;
  • Condition依赖于Lock接口,生成一个Condition的基本代码是lock.newCondition()
  • 调用Condition的await()和signal()方法,都必须在lock保护之内,就是说必须在lock.lock()和lock.unlock之间才可以使用Conditon中的await()对应Object的wait(); Condition中的signal()对应Object的notify(); Condition中的signalAll()对应Object的notifyAll()

D、Thread的wait/notify/notifyAll继承自Object.没有自己实现.

2、下面HttpServletResponse方法调用,那些给客户端回应了一个定制的HTTP回应头(AB)

A、response.setHeader("X-MyHeader", "34");

B、response.addHeader("X-MyHeader", "34");

C、response.setHeader(new HttpHeader("X-MyHeader", "34"));

D、response.addHeader(new HttpHeader("X-MyHeader", "34"));

E、response.addHeader(new ServletHeader("X-MyHeader", "34"));

F、response.setHeader(new ServletHeader("X-MyHeader", "34"));

分析:

进到HttpServletResponse源码里可以看到,它提供如下几个接口:

注意:

1、同名Header可以有多个 ,Header[] getHeaders(String name)。
2、运行时使用的是第一个, Header getFirstHeader(String name)。
3、addHeader,如果同名header已存在,则追加至原同名header后面。
4、setHeader,如果同名header已存在,则覆盖一个同名header。

3、jre 判断程序是否执行结束的标准是(A)

A、所有的前台线程执行完毕

B、所有的后台线程执行完毕

C、所有的线程执行完毕

D、和以上都无关

解析:

其实这个题,就是在说守护线程和非守护(用户)线程的问题。后台线程就是守护线程,前台线程就是用户线程。

守护线程:是指在程序运行时在后台提供一种通用服务的线程,这种线程并不是必须的。同时守护线程的线程优先级都很低的。JVM中的GC线程就是一个守护线程,只要JVM启动,GC线程就启动了。

用户线程和守护线程几乎没有什么区别,唯一的区别就在于,如果用户线程都已经退出了,只剩下了守护线程,那么JVM直接就退出了。

前台线程和后台线程的区别和联系:

1、后台线程不会阻止进程的终止。属于某个进程的所有前台线程都终止后,该进程就会被终止。所有剩余的后台线程都会停止且不会完成。
2、可以在任何时候将前台线程修改为后台线程,方式是设置Thread.IsBackground 属性。
3、不管是前台线程还是后台线程,如果线程内出现了异常,都会导致进程的终止。

4、托管线程池中的线程都是后台线程,使用new Thread方式创建的线程默认都是前台线程。
说明:

应用程序的主线程以及使用Thread构造的线程都默认为前台线程使用Thread建立的线程默认情况下是前台线程,在进程中,只要有一个前台线程未退出,进程就不会终止。主线程就是一个前台线程。而后台线程不管线程是否结束,只要所有的前台线程都退出(包括正常退出和异常退出)后,进程就会自动终止。一般后台线程用于处理时间较短的任务,如在一个Web服务器中可以利用后台线程来处理客户端发过来的请求信息。而前台线程一般用于处理需要长时间等待的任务,如在Web服务器中的监听客户端请求的程序,或是定时对某些系统资源进行扫描的程序。

4、有关线程的哪些叙述是对的(BCD)

A、一旦一个线程被创建,它就立即开始运行。

B、使用start()方法可以使一个线程成为可运行的,但是它不一定立即开始运行。

C、当一个线程因为抢先机制而停止运行,它可能被放在可运行队列的前面。

D、一个线程可能因为不同的原因停止并进入就绪状态。

解析:

一个新创建的线程并不是自动的开始运行的,必须调用它的start()方法使之将线程放入可运行态(runnable state),这只是意味着该线程可被JVM的线程调度程序调度而不是意味着它可以立即运行。
线程的调度是抢先式的,而不是分时间片式的。
具有比当前运行线程高优先级的线程可以使当前线程停止运行而进入就绪状态。
注意C选项,不同优先级的线程间是抢先式的,而同级线程间是轮换式的。
一个线程停止运行可以是因为不同原因,可能是因为更高优先级线程的抢占,也可能是因为调用sleep()方法。而即使是因为抢先而停止也不一定就进入可运行队列的前面,因为同级线程是轮换式的,它的运行可能就是因为轮换,而它因抢占而停止后只能在轮换队列中排队而不能排在前面。

但在抢先式系统下,由高优先级的线程参与调度。分为2种情况:1.若多个线程都处于就绪状态,则具有高优先级的线程会在低优先级之前得到执行;2.在当前线程的运行过程中,如果有较高级别的线程准备就绪,则正在运行的较低级别的线程将被挂起,转到较高级别的线程运行,直到结束后又会转到原来被挂起的线程。第二种情况就描述了C所代表的情况,可以看到当较高级别的线程抢去运行权并运行完成之后,是先将权利转给原来的线程的,所以C是正确的。

5、静态内部类不可以直接访问外围类的非静态数据,而非静态内部类可以直接访问外围类的数据,包括私有数据。( A)

A、正确

B、错误

解析:

内部类:

静态内部类:

    1). 静态内部类本身可以访问外部的静态资源,包括静态私有资源。但是不能访问非静态资源,可以不依赖外部类实例而实例化。

成员内部类:

    1). 成员内部类本身可以访问外部的所有资源,但是自身不能定义静态资源,因为其实例化本身就还依赖着外部类。

局部内部类:

1). 局部内部类就像一个局部方法,不能被访问修饰符修饰,也不能被static修饰。

2). 局部内部类只能访问所在代码块或者方法中被定义为final的局部变量。

匿名内部类:

1). 没有类名的内部类,不能使用class,extends和implements,没有构造方法。

2). 多用于GUI中的事件处理。

3). 不能定义静态资源

4). 只能创建一个匿名内部类实例。

5). 一个匿名内部类一定是在new后面的,这个匿名类必须继承一个父类或者实现一个接口。

6). 匿名内部类是局部内部类的特殊形式,所以局部内部类的所有限制对匿名内部类也有效。

6、JDK提供的用于并发编程的同步器有哪些?(ABC)

A、Semaphore

B、CyclicBarrier

C、CountDownLatch

D、Counter

解析:

A.  semaphore:信号量。用于表示共享资源数量。用acquire()获取资源,用release()释放资源。

B.  CyclicBarrier  线程到达屏障后等待,当一组线程都到达屏障后才一起恢复执行

C. CountDownLatch  初始时给定一个值,每次调用countDown值减1,当值为0时阻塞的线程恢复执行

D、Counter是计数器,目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value。计数值可以是任意的Interger(包括0和负数)。Counter类和其他语言的bags或multisets很相似。

7、下面有关JAVA异常类的描述,说法错误的是?(D)

A、异常的继承结构:基类为Throwable,Error和Exception继承Throwable,RuntimeException和IOException等继承Exception

B、非RuntimeException一般是外部错误(非Error),其一般被 try{}catch语句块所捕获

C、Error类体系描述了Java运行系统中的内部错误以及资源耗尽的情形,Error不需要捕捉

D、RuntimeException体系包括错误的类型转换、数组越界访问和试图访问空指针等等,必须被 try{}catch语句块所捕获

解析:

注意:异常和错误的区别:异常能被程序本身可以处理,错误是无法处理。

通常,Java的异常(包括Exception和Error)分为 可查的异常(checked exceptions)和不可查的异常(unchecked exceptions) 。
可查异常(编译器要求必须处置的异常): 正确的程序在运行中,很容易出现的、情理可容的异常状况 。 可查异常虽然是异常状况,但在一定程度上它的发生是可以预计的,而且一旦发生这种异常 状况,就必须采取某种方式进行处理。

除了RuntimeException及其子类以外,其他的Exception类及其子类都属于可查异常。这种异常的特点是Java编译器会检查它,也就是说,当程序中可能出现这类异常,要么用try-catch语句捕获它,要么用throws子句声明抛出它,否则编译不会通过。

不可查异常(编译器不要求强制处置的异常):包括运行时异常(RuntimeException与其子类)和错误(Error)。

Exception 这种异常分两大类运行时异常和非运行时异常(编译异常)。程序中应当尽可能去处理这些异常。

运行时异常: 都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。

运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。

非运行时异常 (编译异常): 是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。

8、以下代码执行的结果显示是多少(D )?

A、true,false,true

B、false,true,false

C、true,true,false

D、false,false,true

解析:

Interger 赋予的int数值在-128 - 127的时候,直接从***中获取,这些***引用对Integer对象地址是不变的,但是不在这个范围内的数字,则new Integer(i) 这个地址是新的地址,是不一样的。

String s = "abc":通过字面量赋值创建字符串。则将栈中的引用直接指向该字符串,如不存在,则在常量池中生成一个字符串,再将栈中的引用指向该字符串

String s = “a”+“bc”:编译阶段会直接将“a”和“bc”结合成“abc”,这时如果方法区已存在“abc”,则将s的引用指向该字符串,如不存在,则在方法区中生成字符串“abc”对象,然后再将s的引用指向该字符串

String s = "a" + new String("bc"):栈中先创建一个"a"字符串常量,再创建一个"bc"字符串常量,编译阶段不会进行拼接,在运行阶段拼接成"abc"字符串常量并将s的引用指向它,效果相当于String s = new String("abc"),只有'+'两边都是字符串常量才会在编译阶段优化

9、以下Java程序运行的结果是:(A)

A、1true

B、2true

C、1false

D、2false

解析:

引用传递的实质是将地址值的副本作为实参代替方法中的形参,因此var2与var1里面存储的地址值仍然是一样的,方法中操作的只是var2的一个副本值,并不影响var2本身存储的地址值。

10、已知String a="a",String b="b",String c=a+b,String d=new String("ab") 以下操作结果为true的是(AD)

A、(a+b).equals(c)

B、a+b==c

C、c==d

D、c.equals(d)

解析:

“==” 用于比较基本数据类型时比较的是值,用于比较引用类型时比较的是引用指向的地址。

Object 中的equals() 与 “==” 的作用相同,但String类重写了equals()方法,比较的是对象中的内容。

11、下面有关java classloader说法正确的是(ACD)

A、ClassLoader就是用来动态加载class文件到内存当中用的

B、JVM在判定两个class是否相同时,只用判断类名相同即可,和类加载器无关

C、ClassLoader使用的是双亲委托模型来搜索类的

D、Java默认提供的三个ClassLoader是Boostrap ClassLoader,Extension ClassLoader,App ClassLoader

E、以上都不正确

解析:

JDK中提供了三个ClassLoader,根据层级从高到低为:

  1. Bootstrap ClassLoader,主要加载JVM自身工作需要的类。
  2. Extension ClassLoader,主要加载%JAVA_HOME%\lib\ext目录下的库类。
  3. Application ClassLoader,主要加载Classpath指定的库类,一般情况下这是程序中的默认类加载器,也是ClassLoader.getSystemClassLoader() 的返回值。(这里的Classpath默认指的是环境变量中配置的Classpath,但是可以在执行Java命令的时候使用-cp 参数来修改当前程序使用的Classpath)

JVM加载类的实现方式,我们称为 双亲委托模型

如果一个类加载器收到了类加载的请求,他首先不会自己去尝试加载这个类,而是把这个请求委托给自己的父加载器,每一层的类加载器都是如此,因此所有的类加载请求最终都应该传送到顶层的Bootstrap ClassLoader中,只有当父加载器反馈自己无法完成加载请求时,子加载器才会尝试自己加载。

双亲委托模型的重要用途是为了解决类载入过程中的安全性问题。

假设有一个开发者自己编写了一个名为Java.lang.Object的类,想借此欺骗JVM。现在他要使用自定义ClassLoader来加载自己编写的java.lang.Object类。然而幸运的是,双亲委托模型不会让他成功。因为JVM会优先在Bootstrap ClassLoader的路径下找到java.lang.Object类,并载入它

12、关于下面一段代码,以下说法正确的是: (AC)

A、同一个对象,分别调用方法a和b,锁住的是同一个对象

B、同一个对象,分别调用方法a和c,锁住的是同一个对象

C、同一个对象,分别调用方法b和c,锁住的不是同一个对象

D、同一个对象,分别调用方法a、b、c,锁住的不是同一个对象

解析:

修饰非静态方法 锁的是this 对象,修饰静态方法 锁的是class对象

方法a为同步方法,方法b里面的是同步块,同步方法使用的锁是固有对象this,同步块使用的锁可以是任意对象,但是方法b里面的同步块使用的锁是对象this,所以方法a和方法b锁住的是同一个对象。方法 c为静态同步方法,使用的锁是该类的字节码文件,也就是Test.class。方法d里面的也是同步块,只不过使用的锁是Test.class,所以方法c和方法d锁住的是同一个对象。

13、下列流当中,属于处理流的是:(CD)

A、FilelnputStream

B、lnputStream

C、DatalnputStream

D、BufferedlnputStream

解析:

按照流是否直接与特定的地方(如磁盘、内存、设备等)相连,分为节点流和处理流两类。

  • 节点流:可以从或向一个特定的地方(节点)读写数据。如FileReader.
  • 处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader.处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。

JAVA常用的节点流:

  • 文 件 FileInputStream FileOutputStrean FileReader FileWriter 文件进行处理的节点流。
  • 字符串 StringReader StringWriter 对字符串进行处理的节点流。
  • 数 组 ByteArrayInputStream ByteArrayOutputStream CharArrayReader CharArrayWriter 对数组进行处理的节点流(对应的不再是文件,而是内存中的一个数组)。
  • 管 道 PipedInputStream PipedOutputStream PipedReader PipedWriter对管道进行处理的节点流。

常用处理流(关闭处理流使用关闭里面的节点流)

  • 缓冲流:BufferedInputStrean BufferedOutputStream BufferedReader BufferedWriter  增加缓冲功能,避免频繁读写硬盘。
  • 转换流:InputStreamReader OutputStreamReader 实现字节流和字符流之间的转换。
  • 数据流 DataInputStream DataOutputStream  等-提供将基础数据类型写入到文件中,或者读取出来.

流的关闭顺序

  1. 一般情况下是:先打开的后关闭,后打开的先关闭
  2. 另一种情况:看依赖关系,如果流a依赖流b,应该先关闭流a,再关闭流b。例如,处理流a依赖节点流b,应该先关闭处理流a,再关闭节点流b
  3. 可以只关闭处理流,不用关闭节点流。处理流关闭的时候,会调用其处理的节点流的关闭方法。

一周面试题错题整理(一)相关推荐

  1. PMP错题整理6.6

    PMP错题整理6.6 102. [单选] 项目经理发现没有关于需要哪些部门资源的信息,应该在哪一份文件中更新该信息? A project manager discovers that there is ...

  2. 证券从业资格考试——金融市场基础知识关键点和错题整理

    证券从业资格考试--金融市场基础知识错题及关键知识点整理 金融市场基础知识错题整理 一.各种申请条件(只记录关键的数字) 二.与数字相关的点(时间,百分比,人数等) 三.其他 金融市场基础知识错题整理 ...

  3. 面试题错题解析5_操作系统

    面试题错题解析5_操作系统 核心态下,CPU对一切硬件具有完全访问权限,可以执行机器能够执行的任何指令.而在用户态下,cpu不能执行特权指令. 计算机系统中判断是否有中断发生,应是在(  执行完一条指 ...

  4. 加速度测试什么软件,错题整理神器,喵喵错题APP实现高效学习的第一步

    错题整理神器,喵喵错题APP实现高效学习的第一步 "如何高效的提升学习效率?",关于这一问题,近期我是做了不少功课.因为家里的孩子已经幼升小,但经过一年级上学期半年的学习,孩子的成 ...

  5. LGR 2022 提高组 初赛模拟试题 错题解析

    LGR 2022 提高组 初赛模拟试题 错题解析 单选题 1.某个MV是一段时长4分整的视频文件.它每秒播放10帧画面,每帧图像是一幅分辨率为2048×1152像素(长宽比16:9)的32位真彩色图像 ...

  6. 牛客网错题整理--C++篇1

    牛客网错题整理--C++篇1 1.下列程序的运行结果是PP 10003,请为横线处选择合适的程序(): #include<stdio.h>#include<string.h>s ...

  7. 小明用计算机整理30个数,六年级上册数学期末复习易错题整理_(8)[1]

    六年级上册数学易错题整理(2) 圆和百分数部分 一.填空题 1.圆是平面上的( )线图形,( )决定圆的位置,用字母( )表示: ( )决定圆的大小,用字母( )表示. 2.通过( )并且两端都在( ...

  8. SqlZoo错题整理

    最近复习了一下SQL,在sqlZoo上练手了一些题目,通过练习还是发现了不少问题,这里对错题进行一波记录与整理. 文章目录 1.SELECT_from_WORLD_Tutorial 2.SELECT_ ...

  9. 2020美团(开水团)面试题真题整理最新最全~持续更新中~~~

    大家好我是好好学习天天编程的天天 一个整天在互联网上种菜和砍柴的程序员~ 如果我们每天关注互联网行业,也有心做程序员的话,我们可能进场会听到一些关键词:一东(时间单位),一度(市值单位,一个拼多多是几 ...

最新文章

  1. 编辑器的合并用不了_为什么图片和PDF合并后的PDF页面大小不一
  2. Lync 小技巧-42-动态-IP-统一沟通-环境-IP-变更后-操作
  3. 由Qt中qApp想到的(这是单例模式么???)
  4. 前端学习(1843):前端面试题之vue管理状态
  5. 一份北大信科内部流传的 “CS 自救指南”
  6. Scrapy源码阅读分析_3_核心组件
  7. java service 事物_Service 事务(JdbcUtils 升级)
  8. SET/JFace ProgressIndicator的使用以及来回滚动进度条实际使用示例
  9. java1.8win7_JDK 1.8 安装配置教程(win7 64bit )
  10. 【南邮操作系统实验】页面置换算法 (FIFO、LRU、OPT)Java 版
  11. mach内核和linux对比,海思Hi3511/Hi3512 Linux内核与标准内核差异说明
  12. 自动控制原理第七版胡寿松pdf_自动控制原理简明笔记—(01)
  13. winpe装双系统linux_自制WINPE+MAC安装U盘及双系统存储U盘(增加多系统安装)
  14. webView系列(五)----历史记录
  15. 超详细图文保姆级教程:App开发新手入门(六)
  16. 7 点建议助您写出优雅的 Java 代码
  17. antDesignPro线上刷新404 和 liunx部署使用mock数据 umi-serve + pm2
  18. linux下查找网口_Linux服务器查看对应网卡的网口
  19. 创新案例|语言教育App头牌Duolingo如何重新点燃用户增长350%
  20. 免费批量导入生成sitemap地图的软件

热门文章

  1. 数字电子钟——期末数电大作业Multisim版
  2. matplotlib marker 设置
  3. MySQL按时间段随机更新时间
  4. mysql横切纵切_《圆柱横切及纵切-切》.ppt
  5. 亚马逊A9算法是什么?有什么作用?(案例详解)
  6. ARM简介及Cortex-A9
  7. ps计算机软件专用报告,PS笔记 计算机软件及应用 IT计算机 专业资料.docx
  8. 初学者——Java之实现简易俄罗斯方块
  9. 编写一个函数判断一个整数是不是素数c语言,编写函数判断一个整数是否为素数...
  10. 马云欲保留控制权 阿里或放弃香港上市