Java每日面试题3

一、请说出与线程同步以及线程调度相关的方法。

  • wait():使一个线程处于等待(阻塞)状态,并且释放所持有的对象的锁;
  • sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用
    此方法要处理InterruptedException 异常;
  • notify():唤醒一个处于等待状态的线程,当然在调用此方法的时候,并
    不能确切的唤醒某一个等待状态的线程,而是由JVM 确定唤醒哪个线程,而且与优先级无关;
  • notityAll():唤醒所有处于等待状态的线程,该方法并不是将对象的锁给
    所有线程,而是让它们竞争,只有获得锁的线程才能进入就绪状态;

二、编写多线程程序有几种实现方式?

Java 5 以前实现多线程有两种实现方法:一种是继承Thread 类; 另一种是实现Runnable 接口。两种方式都要通过重写run()方法来定义线程的行为,推荐使用后者,因为Java 中的继承是单继承,一个类有一个父类, 如果继承了Thread 类就无法再继承其他类了,显然使用Runnable 接口更为灵活。

补充:Java 5 以后创建线程还有第三种方式:实现Callable 接口,该接口中的call方法可以在线程执行结束时产生一个返回值。

三、举例说明同步和异步。

如果系统中存在临界资源(资源数量少于竞争资源的线程数量的资源), 例如正在写的数据以后可能被另一个线程读到, 或者正在读的数据可能已经被另一个线程写过了,那么这些数据就必须进行同步存取(数据库操作中的排他锁就是最好的例子) 。当应用程序在对象上调用了一个需要花费很长时间来执行的方法, 并且不希望让程序等待方法的返回时, 就应该使用异步编程, 在很多情况下采用异步途径往往更有效率。事实上,所谓的同步就是指阻塞式操作, 而异步就是非阻塞式操作。

四、线程的基本状态以及状态之间的关系?

在这里插入图片描述

说明:其中Running 表示运行状态,Runnable 表示就绪状态(万事俱备, 只欠CPU),Blocked表示阻塞状态,阻塞状态又有多种情况,可能是因为调用wait()方法进入等待池, 也可能是执行同步方法或同步代码块进入等锁池, 或者是调用了sleep()方法或join()方法等待休眠或其他线程结束,或是因为发生了I/O 中断。

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

Lock 是Java 5 以后引入的新的API,和关键字synchronized 相比主要相同点:
Lock 能完成synchronized 所实现的所有功能;
主要不同点:
Lock 有比synchronized 更精确的线程语义和更好的性能,而且不强制性的要求一定要获得锁。synchronized 会自动释放锁,而Lock 一定要求程序员手工释放, 并且最好在finally 块中释放(这是释放外部资源的最好的地方)。

六、Java 中如何实现序列化,有什么意义?

序列化就是一种用来处理对象流的机制, 所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作, 也可将流化后的对象传输于网络之间。
序列化是为了解决对象流读写操作时可能引发的问题( 如果不进行序列化可能会存在数据乱序的问题)。要实现序列化,需要让一个类实现Serializable 接口,该接口是一个标识性接口,标注该类对象是可被序列化的,然后使用一个输出流来构造一个对象输出流并通过writeObject(Object)方法就可以将实现对象写出(即保存其状态);如果需要反序列化则可以用一个输入流建立对象输入流,然后通过readObject 方法从流中读取对象。序列化除了能够实现对象的持久化之外,还能够用于对象的深度克隆。

七、Java 中有几种类型的流?

字节流和字符流。字节流继承于InputStream、OutputStream,字符流继承于
Reader、Writer。在java.io 包中还有许多其他的流,主要是为了提高性能和使用方便。关于Java 的I/O 需要注意的有两点:一是两种对称性( 输入和输出的对称性,字节和字符的对称性);二是两种设计模式(适配器模式和装潢模式) 。另外Java 中的流不同于C#的是它只有一个维度一个方向。

八、什么是DAO 模式?

DAO( Data Access Object)顾名思义是一个为数据库或其他持久化机制提供了抽象接口的对象,在不暴露底层持久化方案实现细节的前提下提供了各种数据访问操作。在实际的开发中,应该将所有对数据源的访问操作进行抽象化后封装在一个公共API 中。用程序设计语言来说, 就是建立一个接口,接口中定义了此应用程序中将会用到的所有事务方法。在这个应用程序中,当需要和数据源进行交互的时候则使用这个接口,并且编写一个单独的类来实现这个接口, 在逻辑上该类对应一个特定的数据存储。DAO 模式实际上包含了两个模式,一是Data Accessor(数据访问器), 二是Data Object(数据对象) ,前者要解决如何访问数据的问题,而后者要解决的是如何用对象封装数据。

九、获得一个类的类对象有哪些方式?

  • 方法1:类型.class,例如:String.class
  • 方法2:对象.getClass(),例如:”hello”.getClass()
  • 方法3:Class.forName(),例如:Class.forName(“java.lang.String”)

十、Collection 和Collections 的区别?

Collection 是一个接口, 它是Set、List 等容器的父接口; Collections 是个一个工具类,提供了一系列的静态方法来辅助容器操作,这些方法包括对容器的搜索、排序、线程安全化等等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值